Я работаю с приведенной ниже структурой 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;
}
}
}
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 в вашем вопросе.
Спасибо Абра. Я благодарен за вашу ценную помощь. Я не знал, что можно использовать восходящий подход для получения значения узла.