0

//**在 NodeList nList = doc.getElementsByTagName(e); 下面是我的 xml 内容我正在尝试删除 xml 文件中存在的类似标签。nList 显示为空。如何解决问题?

**

    public class DelElement {
public static String parent;
public static void main(String[] args) {

    try {

        File file = new File("D:/vodafone/parse.xml");

        DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder();

        Document doc = dBuilder.parse(file);

        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
        parent=doc.getDocumentElement().getNodeName();
        if (doc.hasChildNodes()) {

            printNote(doc,doc.getChildNodes());

        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

}

private static void printNote(Document doc, NodeList nodeList) throws TransformerException {



    String file = "D:/vodafone/parse.xml";

    for (int count = 0; count < nodeList.getLength(); count++) {

        Node tempNode = nodeList.item(count);

        // make sure it's element node.
        if (tempNode.getNodeType() == Node.ELEMENT_NODE) {

            // get node name and value
            System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
            System.out.println("Node Value =" + tempNode.getTextContent());

            if(tempNode.getNodeName()!=parent){





                System.out.println("----------------------------");



                if (tempNode.getChildNodes().getLength()>1){
                    NodeList nodeMap=tempNode.getChildNodes();
                    System.out.println("inside del");

                    for (int i=0;i<nodeMap.getLength();i++){



                        String e = "'"+(String)nodeMap.item(i).getNodeName()+"'";

                        System.out.println("inside del node:"+e);
                        NodeList nList = doc.getElementsByTagName(e);

                        if (nList.getLength()>1){

                            for (int con=1;i==nList.getLength()-1;con++){

                                Element el = (Element)nList.item(con);
                                System.out.println("element"+el);
                                System.out.println("parent"+el.getParentNode());
                                el.getParentNode().removeChild(el);
                            }
                            TransformerFactory transformerFactory = TransformerFactory.newInstance();

                            Transformer transformer = transformerFactory.newTransformer();
                            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                            DOMSource source = new DOMSource(doc);
                            StreamResult result = new StreamResult(new File(file));
                            transformer.transform(source, result);
                        }
                    }}}

            if (tempNode.hasChildNodes()) {

                // loop again if has child nodes
                printNote(doc, tempNode.getChildNodes());

            }

            System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");

        }

    }

}}
4

3 回答 3

1

问题似乎出在您试图删除节点的“for循环”中。您的循环说:“for (int con=1;i==nList.getLength()-1;con++){” ...根据您的代码,打破循环的条件“i==nList.getLength( )-1" 总是正确的,所以它永远不会进入那个块......

我相信,这就是你应该做的(仍然觉得做一件很小的工作有点复杂;但我猜你只是分享谜题的一部分......见下文;这将删除节点.. .

                        for (int con=nList.getLength()-1; con>=0; con--) {
                            Element el = (Element)nList.item(con);
                            System.out.println("element"+el);
                            System.out.println("parent"+el.getParentNode());
                            el.getParentNode().removeChild(el);
                        }
                        /*
                        for (int con=1;i==nList.getLength()-1;con++){

                            Element el = (Element)nList.item(con);
                            System.out.println("element"+el);
                            System.out.println("parent"+el.getParentNode());
                            el.getParentNode().removeChild(el);
                        }
                        */

希望这可以帮助。

于 2013-04-18T19:44:14.617 回答
0

使用 Xpath:

    Document doc = ...
    XPath xp = XPathFactory.newInstance().newXPath();
    NodeList nodes = (NodeList) xp.evaluate("//sai/test | //dinesh/test", doc, XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); ++i) {
        Node node = nodes.item(i);
        node.getParentNode().removeChild(node);
    }

    TransformerFactory tf ....

更新:

上面的代码只是您可以做的一个示例:另一种方法是查找具有多个 <test> 子节点的所有元素节点,然后进行一些进一步的处理以删除重复项:

    NodeList nodes = (NodeList) xp.evaluate("//node()[count(./test) > 1", doc, XPathConstants.NODESET);
    for (int i = 0; i < nodes.getLength(); ++i) {
        Node parent= nodes.item(i);
        checkAndRemoveDuplicates(parent);
    }

重点在于 XPath 是一个强大的工具,可以帮助您用更少的代码解决问题。

于 2013-04-19T00:35:39.320 回答
-1

看起来像你打电话的时候

doc.getElementsByTagName(e);

e 的值类似于“'test'”。然而,XML 中的元素名称本身只是“测试”(没有单引号)。这可能是你的罪魁祸首

于 2013-04-18T17:33:15.983 回答