gpt4 book ai didi

java - 如何使用 JAVA 中的 DOM 解析器解析一个 XML 文件,其中有两个不同的事务具有所有相同的子标签,但一个标签不同?

转载 作者:行者123 更新时间:2023-12-01 06:11:03 26 4
gpt4 key购买 nike

我有一个 XML 文档,如下所示:

<Transactions>
<Transaction>
<TransactionType>Account Payable</TransactionType>
<TransactionFor>Supplier</TransactionFor>
<TransactionDate>09/11/2015 00:40:31</TransactionDate>
<ItemReference>Hotels</ItemReference>
<Amount>3420.00</Amount>
<AmountPaid>0.00</AmountPaid>
<Balance>3420.00</Balance>
<Status>Open</Status>
<SupplierID>3930d9cd-1d8a-4e4d-99d3-4cd4b208795d</SupplierID>
</Transaction>
<Transaction>
<TransactionType>Account Receivable</TransactionType>
<TransactionFor>Consumer</TransactionFor>
<TransactionDate>09/11/2015 00:40:31</TransactionDate>
<ItemReference>Hotels</ItemReference>
<Amount>3420.00</Amount>
<AmountPaid>3420.00</AmountPaid>
<Balance>0.00</Balance>
<Status>Closed</Status>
<ConsumerID>65e3dbb6-4353-4fbb-8e8b-28d0c09dc728</ConsumerID>
</Transaction>
</Transactions>

当一个标签不同时(例如 supplierIdconsumerId),我如何在 Java 中解析它?

我已经实现了这个代码,但是得到了一个NullPointerException:

NodeList nList8 = doc.getElementsByTagName("Transaction");

for (int temp8 = 0; temp8 < nList8.getLength(); temp8++)
{
Node nNode8 = nList8.item(temp8);
if (nNode8.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement8 = (Element) nNode8;
System.out.println("TransactionType : " + eElement8.getElementsByTagName("TransactionType").item(0).getTextContent());
System.out.println("TransactionFor : " + eElement8.getElementsByTagName("TransactionFor").item(0).getTextContent());
System.out.println("TransactionDate : " + eElement8.getElementsByTagName("TransactionDate").item(0).getTextContent());
System.out.println("ItemReference : " + eElement8.getElementsByTagName("ItemReference").item(0).getTextContent());
System.out.println("Amount : " + eElement8.getElementsByTagName("Amount").item(0).getTextContent());
System.out.println("AmountPaid : " + eElement8.getElementsByTagName("AmountPaid").item(0).getTextContent());
System.out.println("Balance : " + eElement8.getElementsByTagName("Balance").item(0).getTextContent());
System.out.println("Status : " + eElement8.getElementsByTagName("Status").item(0).getTextContent());
if(eElement8.getElementsByTagName("SupplierID").item(0).getTextContent()==null)
{
System.out.println("ConsumerID : " + eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent());
}
else if(eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent() == null)
System.out.println("SupplierID : " + eElement8.getElementsByTagName("SupplierID").item(0).getTextContent());
}
}

最佳答案

出现此问题的原因是,在测试父元素 (SupplierIDConsumerID) 存在:

            if (eElement8.getElementsByTagName("SupplierID").item(0).getTextContent() == null)
{

} else if (eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent() == null) {

}

您采用的方法是合理的,但是您需要在遍历树时在每个级别执行空检查。最终,您应该从正在使用的顶级元素开始,然后一次一个地向下处理一个元素。

如果您想跳过空检查,最好先根据架构或 DTD(如果存在)验证文档,以确保在尝试访问节点之前文档符合预期的结构。不过上面的代码还是有问题的。

我建议通过以下方式将解析与业务逻辑分开(原始方法是 parse1(),新方法是 parse2()):

import java.io.File;
import java.io.FileInputStream;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomTest
{
public static void main(String[] args)
{
File iFile = new File("src/main/resources/domtest.xml");

try
{
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(iFile));

new DomTest().parse2(doc);
} catch (Exception e) {
e.printStackTrace();

System.out.println("Failed to parse " + iFile.getAbsolutePath());
System.exit(1);
}

System.exit(0);
}

public void parse1(Document doc)
{
NodeList nList8 = doc.getElementsByTagName("Transaction");

for (int temp8 = 0; temp8 < nList8.getLength(); temp8++)
{
Node nNode8 = nList8.item(temp8);

if (nNode8.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement8 = (Element) nNode8;

System.out.println("TransactionType : " + eElement8.getElementsByTagName("TransactionType").item(0).getTextContent());
System.out.println("TransactionFor : " + eElement8.getElementsByTagName("TransactionFor").item(0).getTextContent());
System.out.println("TransactionDate : " + eElement8.getElementsByTagName("TransactionDate").item(0).getTextContent());
System.out.println("ItemReference : " + eElement8.getElementsByTagName("ItemReference").item(0).getTextContent());
System.out.println("Amount : " + eElement8.getElementsByTagName("Amount").item(0).getTextContent());
System.out.println("AmountPaid : " + eElement8.getElementsByTagName("AmountPaid").item(0).getTextContent());
System.out.println("Balance : " + eElement8.getElementsByTagName("Balance").item(0).getTextContent());
System.out.println("Status : " + eElement8.getElementsByTagName("Status").item(0).getTextContent());

if (eElement8.getElementsByTagName("SupplierID").item(0).getTextContent() == null)
{
System.out.println("ConsumerID : " + eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent());
} else if (eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent() == null) {
System.out.println("SupplierID : " + eElement8.getElementsByTagName("SupplierID").item(0).getTextContent());
}
}
}

return;
}

public void parse2(Document doc)
{
Element transactionsEl = doc.getDocumentElement();

NodeList transactionEls = transactionsEl.getElementsByTagName("Transaction");

for (int txIdx = 0; txIdx < transactionEls.getLength(); txIdx++)
{
// we know that this an Element node because we used getElementsByTagName above
Element transactionEl = (Element) transactionEls.item(txIdx);

String transactionType = null;
String transactionFor = null;
String transactionDate = null;
String itemReference = null;
String amount = null;
String amountPaid = null;
String balance = null;
String status = null;
String consumerID = null;
String supplierID = null;

NodeList transactionElChildNodes = transactionEl.getChildNodes();

for (int i = 0; i < transactionElChildNodes.getLength(); i++)
{
Node n = transactionElChildNodes.item(i);

if (n.getNodeType() == Node.ELEMENT_NODE)
{
Element someEl = (Element) n;

String elName = someEl.getTagName();
String text = someEl.getTextContent();

if (elName.equals("TransactionType"))
{
transactionType = text;
} else if (elName.equals("TransactionFor")) {
transactionFor = text;
} else if (elName.equals("TransactionDate")) {
transactionDate = text;
} else if (elName.equals("ItemReference")) {
itemReference = text;
} else if (elName.equals("Amount")) {
amount = text;
} else if (elName.equals("AmountPaid")) {
amountPaid = text;
} else if (elName.equals("Balance")) {
balance = text;
} else if (elName.equals("Status")) {
status = text;
} else if (elName.equals("SupplierID")) {
supplierID = text;
} else if (elName.equals("ConsumerID")) {
consumerID = text;
}
}
}

// business logic follows:

System.out.println("Transaction " + String.valueOf(txIdx));

if (supplierID != null)
{
System.out.println("SupplierID: " + supplierID);
}

if (consumerID != null)
{
System.out.println("ConsumerID: " + consumerID);
}
}

return;
}
}

结果:

Transaction 0
SupplierID: 3930d9cd-1d8a-4e4d-99d3-4cd4b208795d
Transaction 1
ConsumerID: 65e3dbb6-4353-4fbb-8e8b-28d0c09dc728

关于java - 如何使用 JAVA 中的 DOM 解析器解析一个 XML 文件,其中有两个不同的事务具有所有相同的子标签,但一个标签不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34492125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com