Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JAVA中使用DOM解析器解析两个具有相同子标记的不同事务,但其中一个标记不同的XML文件?_Java_Xml_Parsing_Dom - Fatal编程技术网

如何在JAVA中使用DOM解析器解析两个具有相同子标记的不同事务,但其中一个标记不同的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> &

我有一个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>
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