簡體   English   中英

在java中讀取復雜的Xml文件

[英]Read Complex Xml file in java

我能夠在 java 中讀取多種類型的 xml 文件。 但今天我得到了一個 xml 文件,但無法讀取其詳細信息。

<ENVELOPE>
    <BILLFIXED>
        <BILLDATE>1-Jul-2017</BILLDATE>
        <BILLREF>1</BILLREF>
        <BILLPARTY>Party1</BILLPARTY>
    </BILLFIXED>
    <BILLCL>-10800.00</BILLCL>
    <BILLPDC/>
    <BILLFINAL>-10800.00</BILLFINAL>
    <BILLDUE>1-Jul-2017</BILLDUE>
    <BILLOVERDUE>30</BILLOVERDUE>
    <BILLFIXED>
        <BILLDATE>1-Jul-2017</BILLDATE>
        <BILLREF>2</BILLREF>
        <BILLPARTY>Party2</BILLPARTY>
    </BILLFIXED>
    <BILLCL>-2000.00</BILLCL>
    <BILLPDC/>
    <BILLFINAL>-2000.00</BILLFINAL>
    <BILLDUE>1-Jul-2017</BILLDUE>
    <BILLOVERDUE>30</BILLOVERDUE>
    <BILLFIXED>
        <BILLDATE>1-Jul-2017</BILLDATE>
        <BILLREF>3</BILLREF>
        <BILLPARTY>Party3</BILLPARTY>
    </BILLFIXED>
    <BILLCL>-1416.00</BILLCL>
    <BILLPDC/>
    <BILLFINAL>-1416.00</BILLFINAL>
    <BILLDUE>31-Jul-2017</BILLDUE>
    <BILLOVERDUE>0</BILLOVERDUE>
</ENVELOPE>

我正在使用此代碼讀取 xml 文件。 我能夠讀取<BILLFIXED>標簽內的數據,但無法讀取諸如 < BILLFINAL><BILLDUE>等之外的數據。

try {
          File fXmlFile = new File("filepath");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            
            doc.getDocumentElement().normalize();
            NodeList billNodeList = doc.getElementsByTagName("ENVELOPE");
            for(int i=0;i<billNodeList.getLength();i++){
                Node voucherNode = billNodeList.item(i);
                Element voucherElement = (Element) voucherNode;
                NodeList nList = voucherElement.getElementsByTagName("BILLFIXED");
                
                for (int temp = 0; temp < nList.getLength(); temp++) {
                    Node insideNode = nList.item(temp);
                    Element voucherElements = (Element) insideNode;
                    System.out.println(voucherElements.getElementsByTagName("BILLDATE").item(0).getTextContent());
                    System.out.println(voucherElements.getElementsByTagName("BILLREF").item(0).getTextContent());
                    System.out.println(voucherElements.getElementsByTagName("BILLPARTY").item(0).getTextContent());
                    System.out.println(voucherElements.getElementsByTagName("BILLFINAL").item(0).getTextContent());
                    System.out.println(voucherElements.getElementsByTagName("BILLOVERDUE").item(0).getTextContent());
                }
            }
            
            
    } catch (Exception e) {
        e.printStackTrace();
    }

我正在嘗試我知道的所有可能的方法,但目前我無法找到任何解決方案。 如果有人有任何解決方案,請與我分享。

一種方法是“修復” XML 使其結構更合理,例如:

// Fix the XML
Element envelopeElem = doc.getDocumentElement();
List<Node> children = new ArrayList<>();
for (Node child = envelopeElem.getFirstChild(); child != null; child = child.getNextSibling())
    children.add(child);
Element billElem = null;
for (Node child : children) {
    if (child.getNodeType() == Node.ELEMENT_NODE && "BILLFIXED".equals(child.getNodeName()))
        envelopeElem.insertBefore(billElem = doc.createElement("BILL"), child);
    if (billElem != null)
        billElem.appendChild(child);
}

代碼基本上在遇到<BILLFIXED>元素時創建一個新的<BILL>元素作為<ENVELOPE>的子元素,然后將所有后續節點移動到<BILL>元素中。

結果是 DOM 樹中的 XML 看起來像這樣1 ,這對您來說應該更容易處理:

<ENVELOPE>
    <BILL>
        <BILLFIXED>
            <BILLDATE>1-Jul-2017</BILLDATE>
            <BILLREF>1</BILLREF>
            <BILLPARTY>Party1</BILLPARTY>
        </BILLFIXED>
        <BILLCL>-10800.00</BILLCL>
        <BILLPDC/>
        <BILLFINAL>-10800.00</BILLFINAL>
        <BILLDUE>1-Jul-2017</BILLDUE>
        <BILLOVERDUE>30</BILLOVERDUE>
    </BILL>
    <BILL>
        <BILLFIXED>
            <BILLDATE>1-Jul-2017</BILLDATE>
            <BILLREF>2</BILLREF>
            <BILLPARTY>Party2</BILLPARTY>
        </BILLFIXED>
        <BILLCL>-2000.00</BILLCL>
        <BILLPDC/>
        <BILLFINAL>-2000.00</BILLFINAL>
        <BILLDUE>1-Jul-2017</BILLDUE>
        <BILLOVERDUE>30</BILLOVERDUE>
    </BILL>
    <BILL>
        <BILLFIXED>
            <BILLDATE>1-Jul-2017</BILLDATE>
            <BILLREF>3</BILLREF>
            <BILLPARTY>Party3</BILLPARTY>
        </BILLFIXED>
        <BILLCL>-1416.00</BILLCL>
        <BILLPDC/>
        <BILLFINAL>-1416.00</BILLFINAL>
        <BILLDUE>31-Jul-2017</BILLDUE>
        <BILLOVERDUE>0</BILLOVERDUE>
    </BILL>
</ENVELOPE>

1) XML 已重新格式化以提高可讀性,即重新縮進。

它不是結構良好的 XML。 在您的<envelope>標簽內,沒有任何內容表明構成“賬單”的每組六個屬性的開始。 您通常希望每個人都有一個<bill></bill>標簽來包含它們。 這會混淆解析器......

根據示例 XML,它有 3 條記錄的數據。 但是每條記錄沒有任何分隔。 看起來每個字段數據都填充到 XML 標記中並寫入文件。

我建議有兩種可能的選擇

  1. 基於 JAVA :正如 Andreas 建議的那樣,讀取文件內容並為每條記錄添加一個根標記,這將提供有限的 XML 結構,然后更容易處理。 當輸入文件很大時,性能影響可能會增加。
  2. 基於轉換:嘗試 STX 轉換,它將結構轉換為 XML 甚至平面文件所需的格式。 然后處理會更簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM