如何在JAVA中使用DOM解析器解析两个具有相同子标记的不同事务,但其中一个标记不同的XML文件?
我有一个XML文档,如下所示:如何在JAVA中使用DOM解析器解析两个具有相同子标记的不同事务,但其中一个标记不同的XML文件?,java,xml,parsing,dom,Java,Xml,Parsing,Dom,我有一个XML文档,如下所示: <Transactions> <Transaction> <TransactionType>Account Payable</TransactionType> <TransactionFor>Supplier</TransactionFor> <TransactionDate>09/11/2015 00:40:31</TransactionDate> &
<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>
XML意味着可扩展标记语言
1您可以将任何结构、任何树和任何节点放在一个xml文件中,只要它们遵守简单的规则:open标记必须有一个对称的结束标记,一些字符约束
它确实非常开放,您可以放置Mo Go?,并且由于打开/关闭标记,它非常健壮
您还可以进一步添加新数据,而无需在下一点中断应用程序
2然后你可以解析它们
继续搜索一些解析器和示例。再看看xpath
你解析并得到你想要的。如果有太多的数据,如果你想要严格的格式,你可以忘记它们
3注意标记不是唯一的:你可以重复他,甚至在子级别使用它,甚至使用相同标记的子标记
4那个么问题可能在于你们的设计,以及你们在解析的时候想要做什么
如果一个元素有一个标记供应商ID,而另一个没有,您想做什么?创建不同的对象,以不同的方式处理?这取决于你
5如果您需要严格的数据和结构规则,还可以使用DTD/XML模式、工具和库来检查XML输入
希望有帮助。出现问题的原因是,在测试父元素SupplierID或ConsumerID是否存在之前,您试图通过.item0.getTextContent访问子节点: 您所采用的方法是合理的,但在遍历树时,需要在每个级别执行空检查。最终,您应该从您正在使用的顶级元素开始,一次一个元素地工作 如果要跳过空检查,最好先根据架构或DTD(如果存在)验证文档,以确保文档符合预期结构,然后再尝试访问节点。但是,上面的代码仍然有问题 我建议按照以下方式将解析与业务逻辑分离:原始方法为parse1,新方法为parse2:
@SyedAqib您在NodeList nList8=doc.GetElementsByTagnameTransation中获得空指针异常;此行表示单据为空。。尝试调试感谢vallis提供的解决方案:
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());
}
}
if (eElement8.getElementsByTagName("SupplierID").item(0).getTextContent() == null)
{
} else if (eElement8.getElementsByTagName("ConsumerID").item(0).getTextContent() == null) {
}
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