簡體   English   中英

具有相同屬性名稱的XML字符串解析嵌套標記

[英]XML string parsing nested tag with same attribute name

我正在從sql server解析xml字符串。 但是我的xml字符串具有嵌套標記,我正在共享xml字符串。

<abc sn="ahdahsdaud" family="abc" style="Aa" model="abc111222">
<part number="7N8901160101" fnum="5" qty="1.000" uom="EA">
<l2part number="075-76067-000" fnum="9000" qty="0.000" uom="EA" />
</part>
<part number="392-41230-001" fnum="440" qty="1.000" uom="EA">
<l2part number="092-41230-000" fnum="9000" qty="0.000" uom="EA" />
</part>
</abc>

所以在這里,我通過使用以下代碼來獲取零件標簽屬性:

List<abBOM> list = new ArrayList<abBOM>();//pojo
  abBOM abbom = null;

  while(rs.next()){
      SQLXML plan = rs.getSQLXML("XMLATT");//XMLAttribute
      String xmlstr=plan.getString();
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(new InputSource(new StringReader(xmlstr)));
      document.getDocumentElement().normalize();
      Element root = document.getDocumentElement();
     // System.out.println(root.getNodeName());
      NodeList nList = document.getElementsByTagName("part");
     // System.out.println("size"+nList.getLength());
      for (int temp = 0; temp < nList.getLength(); temp++)
      {
         Node node = nList.item(temp);
         if (node.getNodeType() == Node.ELEMENT_NODE)
         {
            Element eElement = (Element) node;

            //System.out.println(eElement.getElementsByTagName("number").item(0).getTextContent());

            abbom = new abBOM();
            abbom.setNumber(eElement.getAttribute("number"));
            abbom.setfindNumber(eElement.getAttribute("fnum"));
            abbom.setQty(eElement.getAttribute("qty"));
            abbom.setUom(eElement.getAttribute("uom"));

            list.add(abbom);
         }
      }
  }

輸出清單:

[[7N8901160101,5,1.000,EA], [392-41230-001,440,1.000,EA]]

我想將l2part標簽屬性存儲在同一列表中,即。 零件屬性,然后像這樣的l2part屬性。 請提出任何建議。

提前致謝。

處理part元素后,將l2part讀取為新的NodeList。

您可以重構代碼以遞歸地執行它。 假設您的XML就像顯示的一樣簡單:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;

public class T {
    static String data = "<abc sn=\"ahdahsdaud\" family=\"abc\" style=\"Aa\" model=\"abc111222\">\n" +
            "<part number=\"7N8901160101\" fnum=\"5\" qty=\"1.000\" uom=\"EA\">\n" +
            "<l2part number=\"075-76067-000\" fnum=\"9000\" qty=\"0.000\" uom=\"EA\" />\n" +
            "</part>\n" +
            "<part number=\"392-41230-001\" fnum=\"440\" qty=\"1.000\" uom=\"EA\">\n" +
            "<l2part number=\"092-41230-000\" fnum=\"9000\" qty=\"0.000\" uom=\"EA\" />\n" +
            "</part>\n" +
            "</abc>";

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new InputSource(new StringReader(data)));
        document.getDocumentElement().normalize();
        Element root = document.getDocumentElement();
        // System.out.println(root.getNodeName());

        NodeList nList = document.getElementsByTagName("part");
        // System.out.println("size"+nList.getLength());
        processNodeList(nList);
    }

    private static void processNodeList(NodeList nList) {
        for (int temp = 0; temp < nList.getLength(); temp++)
        {
            Node node = nList.item(temp);
            if (node.getNodeType() == Node.ELEMENT_NODE)
            {
                Element eElement = (Element) node;

                //System.out.println(eElement.getElementsByTagName("number").item(0).getTextContent());
                abbom = new abBOM();
                abbom.setNumber(eElement.getAttribute("number"));
                abbom.setfindNumber(eElement.getAttribute("fnum"));
                abbom.setQty(eElement.getAttribute("qty"));
                abbom.setUom(eElement.getAttribute("uom"));

                list.add(abbom);

                NodeList lpart2 = eElement.getElementsByTagName("l2part");
                processNodeList(lpart2);

            }
        }
    }
}

請注意,如果您嵌套了l2part級別,它們也會被處理。 否則它將讀取一個空列表。 可能需要根據您的數據進行優化

只需在內部重復循環,如下所示:

NodeList nList = document.getElementsByTagName("part");
// System.out.println("size"+nList.getLength());
for (int temp = 0; temp < nList.getLength(); temp++)
{
   Element eElement = (Element) nList.item(temp);    

   // System.out.println(eElement.getElementsByTagName("number").item(0).getTextContent());

   abbom = new abBOM();
   abbom.setNumber(eElement.getAttribute("number"));
   abbom.setfindNumber(eElement.getAttribute("fnum"));
   abbom.setQty(eElement.getAttribute("qty"));
   abbom.setUom(eElement.getAttribute("uom"));

   list.add(abbom);

   NodeList list2 = eElement.getElementsByTagName("l2part");
   for (int t2 = 0; t2 < list2.getLength(); t2++)
   {
      eElement = (Element) list2.item(t2);
      abBOM abbom2 = new abBOM();
      abbom2.setNumber(eElement.getAttribute("number"));
      abbom2.setfindNumber(eElement.getAttribute("fnum"));
      abbom2.setQty(eElement.getAttribute("qty"));
      abbom2.setUom(eElement.getAttribute("uom"));
      list.add(abbom2);
   }
}

暫無
暫無

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

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