繁体   English   中英

如何在Java中从XML导航dom树

[英]How to navigate dom tree from XML in java

下面是我正在使用的xml的示例,由于某些字段没有必要证明我的观点,因此我将其删除了。

我正在尝试从此xml解析订单。 但是,当我尝试解析每个订单的产品集时遇到问题。 处理第一个订单时,与其添加下面详细介绍的2个集合,不如将可在xml中找到的所有集合添加到第一订单中。 我不确定如何解决这个问题,因为这对我来说还很新。 下面是我的java ...

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();

// Create a list of orders and sub elements
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
nList = doc.getElementsByTagName("order");
setList = doc.getElementsByTagName("set");
orders = new Order[nList.getLength()];
Node nNode = nList.item(i);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {

    Element eElement = (Element) nNode;
    temp = new Order();
    // Populate order with details from XML
    parseClientDetails(eElement);

    // Add sets
    parseSets();
    temp.setSets(setArray);
    orders[i] = temp;
}

...

    private void parseSets() {
        Node nNode;
        Element element;
        for (int c = 0; c < setList.getLength(); c++) {
            nNode = setList.item(c);
            element = (Element) nNode;

            tempSet = new Set();
            tempSet.setBandwidth(getValue("bandwidth", element));
            tempSet.setCategory(getValue("category", element));
            tempSet.setSet_package(getValue("package", element));
            setArray.add(tempSet);
        }
    }

XML:

<orderSet>
  <order>
    <customer name="SelectCustomerDetails">
        <clientId>UK12345</clientId>
        <etc>...</etc>
    </customer>
    <product>
        <set>
            <category>Silver</category>
            <package>3000IP</package>
            <bandwidth>160</bandwidth>
        </set>
        <set>
            <category>Silver</category>
            <package>3000IP</package>
            <bandwidth>320</bandwidth>
        </set>
    </product>
  </order>
  <order>
  ...
  </order>
</orderSet>

问题是您正在调用doc.getElementsByTagName("set") ,该文件为您提供了整个文档中所有sets的列表。 相反,您需要在每个订单上调用它,如下所示:

 nList = doc.getElementsByTagName("order");
 orders = new Order[nList.getLength()];
 Node nNode = nList.item(i);
 if (nNode.getNodeType() == Node.ELEMENT_NODE) {
     Element eElement = (Element) nNode;

     //get the sets for the current order only
     NodeList setList = eElement.getElementsByTagName("set");

     //now process the sets
 }

您可以使用“ javax.xml.xpath” API从XML文档中获取所需的内容。 这些API是Java SE 5中引入的,并且提供了比“ getElementsByTagName”更多的控制权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM