xml节点删除在使用dom解析器的Java中无法正常工作?

时间:2014-12-29 11:03:08

标签: java xml dom nodes xmlnode

这里我有xml节点,我正在显示并选择要删除的特定节点。对于我的下面的xml文件和代码,虽然我选择了第二个节点,但只有第一个节点正在删除。

<root>
 <book>  <!--node 1 -->
 <id>1111</id>
 <name>abacd</name>
 <author>abcd</author>
 <price>700</price>
 <category>abcd</category>
</book>
<book>  <!--node 2 -->
 <id>2222</id>
 <name>abacd</name>
 <author>abcd</author>
 <price>700</price>
 <category>abcd</category>
</book>
 <book>  <!--node 3 -->
  <id>3333</id>
  <name>abacd</name>
  <author>abcd</author>
  <price>700</price>
 <category>abcd</category>
</book>
</root>

我的java代码将节点删除为

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);
    int nodeValue = Integer.parseInt(nodeNumber);
    //nodeValue is node number eg: 2;
    NodeList bookList = doc.getElementsByTagName("book");
    for (int i = 1; i <= bookList.getLength(); i++) {
        if (i == nodeValue) {
            Element rootElement = (Element) doc.getElementsByTagName("book").item(0);
            Element idElement = (Element) doc.getElementsByTagName("id").item(0);
            idElement.getParentNode().removeChild(idElement);
            Element nameElement = (Element) doc.getElementsByTagName("name").item(0);
            nameElement.getParentNode().removeChild(nameElement);
            Element authorElement = (Element) doc.getElementsByTagName("author").item(0);
            authorElement.getParentNode().removeChild(authorElement);
            Element priceElement = (Element) doc.getElementsByTagName("price").item(0);
            priceElement.getParentNode().removeChild(priceElement);
            Element categoryElement = (Element) doc.getElementsByTagName("category").item(0);
            categoryElement.getParentNode().removeChild(categoryElement);
            rootElement.getParentNode().removeChild(rootElement);
            doc.normalize();
        }
    }

任何人都可以指导我在哪里更改我的代码。

2 个答案:

答案 0 :(得分:0)

您总是通过此

调用第一个节点
doc.getElementsByTagName("book").item(0);

而是尝试使用

doc.getElementsByTagName("book").item(nodeValue);

或使用bookList.item(nodeValue)直接访问节点

答案 1 :(得分:0)

如果我们想根据节点号删除节点,那么下面的代码会有所帮助。我得到了我的回答

int nodeValue = Integer.parseInt(nodeNumber);
    NodeList bookList = doc.getElementsByTagName("book");
    Node nNode = bookList.item(nodeValue);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
        Element eElement = (Element) nNode;
        eElement.getParentNode().removeChild(nNode);
    }

它将删除所选节点(例如:2)。