Чтение узла на основе условия из многоуровневого xml в Java

Я работаю с приведенной ниже структурой XML и читаю значение GUID из узла Address, где значение UsageCode установлено как «СТАНДАРТ». Код работал нормально, но теперь сегмент AddressUsage переопределяется исходной системой как необязательный, и поэтому UsageCode не возвращается для всех Address узлов в XML.

<BusinessPartner>
   <ID>2494271</ID>
   <Address>
      <GUID>000d8a5c-8bc5-1eda-b8cc-53078a383c3f</GUID>
      <ValidityPeriod>
         <StartDate>2020-08-06</StartDate>
         <EndDate>9999-12-31</EndDate>
      </ValidityPeriod>
   </Address>
   <Address>
      <GUID>000d8a5c-8bc5-1eda-b8cc-53078a384c5f</GUID>
      <ValidityPeriod>
         <StartDate>2020-08-06</StartDate>
         <EndDate>9999-12-31</EndDate>
      </ValidityPeriod>
      <AddressUsage>
         <UsageCode>STANDARD</UsageCode>
      </AddressUsage>
   </Address>
</BusinessPartner>

Приведенный выше XML может иметь несколько сегментов Address, а узел AddressUsage является необязательным. Из-за отсутствия узла AddressUsage этот код теперь возвращает неправильный GUID (из первого узла Address).

Любое предложение, как это исправить?

// Get Document Builder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// Build Document
Document document = builder.parse(new File("BPData2.xml"));

// Normalize the XML Structure;
document.getDocumentElement().normalize();

NodeList AddList = document.getElementsByTagName("AddressUsage");
for (int i = 0; i < AddList.getLength(); i++) {
    NodeList AddChildList = AddList.item(i).getChildNodes();
    for (int j = 0; j < AddChildList.getLength(); j++) {
        Node UsageChildNode = AddChildList.item(j);
        if ("UsageCode".equals(UsageChildNode.getNodeName()) && 
            "STANDARD".equals(AddChildList.item(j).getTextContent())) {
            NodeList AddUUID = document.getElementsByTagName("GUID");
            System.out.println(AddUUID.item(i).getTextContent());
            break;
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

UsageCode — это тег, который вас интересует, поэтому используйте эти элементы, а не AddressUsage. Для каждого элемента убедитесь, что его текстовое содержимое является «СТАНДАРТНЫМ», и если это так, получите прародительский узел, который является элементом Address. Затем перебирайте дочерние элементы Address, пока не найдете GUID. Получите текстовое содержимое GUID, и все готово.

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlPars2 {

    public static void main(String[] args) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new File("BPData2.xml"));
            document.getDocumentElement().normalize();
            NodeList usages = document.getElementsByTagName("UsageCode");
            int count = usages.getLength();
            for (int i = 0; i < count; i++) {
                Node n = usages.item(i);
                if ("STANDARD".equals(n.getTextContent())) {
                    Node parent = n.getParentNode();
                    Node grandparent = parent.getParentNode();
                    NodeList children = grandparent.getChildNodes();
                    int count2 = children.getLength();
                    for (int j = 0; j < count2; j++) {
                        Node target = children.item(j);
                        if ("GUID".equals(target.getNodeName())) {
                            System.out.println(target.getTextContent());
                        }
                    }
                }
            }
        }
        catch (IOException | ParserConfigurationException | SAXException x) {
            x.printStackTrace();
        }
    }
}

Обратите внимание, что приведенный выше код основан на образце XML в вашем вопросе.

Спасибо Абра. Я благодарен за вашу ценную помощь. Я не знал, что можно использовать восходящий подход для получения значения узла.

Jitender 22.12.2020 14:26

Другие вопросы по теме