【问题标题】:Algorithm for identifying differences in XML documents识别 XML 文档差异的算法
【发布时间】:2015-07-15 19:57:16
【问题描述】:

我正在尝试用 Java 创建一个程序,它采用两个 XML 文件(一个是另一个的更新版本)并将它们放入主内存。然后它将比较文件并计算两者中每个对应节点之间的差异数(不包括空白)。稍后程序将对差异做更多,但我只是对如何开始比较来自两个单独文件的节点感到困惑。任何建议将不胜感激。

【问题讨论】:

    标签: java xml algorithm diff


    【解决方案1】:

    我的第一个建议是你可以使用XMLUnit:

    Reader expected=new FileReader(...);
    Reader tested=new FileReader(...);
    Diff diff=XMLUnit.compareXML(expected, tested);
    

    【讨论】:

      【解决方案2】:

      有关在每个节点计算签名(哈希)以便于比较的算法,请参阅Detecting Changes in XML Documents

      有关元素排序无关紧要的 XML 文档的更改检测,请参阅X-Diff: An Effective Change Detection Algorithm for XML Documents。 X-Diff 算法的 Java 和 C++ 实现是available

      【讨论】:

        【解决方案3】:

        这取决于您是否存在节点差异或节点内部差异。

        此代码提取所有节点及其路径, 和里面的价值

        假设,你有两个 xml 文档:

        XPath xPath = XPathFactory.newInstance().newXPath();
        //Every nodes
        expression="//*";
        NodeList nodes  = (NodeList)  xPath.compile(expression).evaluate(document, XPathConstants.NODESET);
        
        // iterate them all
        for(int i=0; i<nodes.getLength(); i++)
        {
         Node the_node = nodes.item(i);
        
         if(the_node instanceof Element)
            {
             Element the_element=(Element) the_node;
        
            // PATH 
            String path ="";
            Node noderec = the_node; 
            while( noderec  != null) 
                {
                if (path.equals("")) path = noderec.getNodeName();
                else
               path = noderec.getNodeName() + '/' + path;
               noderec = noderec.getParentNode();
        
               if (noderec==document){path="//"+path; noderec=null;}
               }
              System.out.println( "PATH:"+path );
             System.out.println("CONTENT="+the_element.getTextContent());
            }
        }
        

        PATH : 给你路径

        CONTENT:节点的子内容

        这样,您就可以获取 xml 的所有路径:您可以逐个比较、排序并使用其他算法来查找是否插入了某些内容,...

        并且在每个节点内部,你可以进行另一个比较。

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-14
          • 2023-04-08
          相关资源
          最近更新 更多