使用java更新xml文件的问题?

时间:2013-04-18 16:31:46

标签: java xml parsing java-ee xml-parsing

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

**                                                
                                                                  

    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]");

        }

    }

}}

3 个答案:

答案 0 :(得分: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);
                        }
                        */

希望这有帮助。

答案 1 :(得分: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 ....

更新:

上面的代码只是您可以做的一个示例:另一种方法可能是找到具有多个&lt; test&gt;的所有元素节点。 child,然后进行一些进一步的处理以删除重复项:

    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是一个功能强大的工具,可以帮助您用更少的代码解决问题。

答案 2 :(得分:-1)

看起来好像在你打电话

doc.getElementsByTagName(e);

e的值类似于&#34;&#39; test&#39;&#34;。但是,XML中的元素名称本身只是&#34; test&#34; (没有单引号)。这可能是你的罪魁祸首