[英]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.