用于识别XML文档中的差异的算法

时间:2015-07-15 19:57:17

标签: java xml algorithm diff

我正在尝试用Java创建一个带有两个XML文件的程序(一个是另一个的更新版本)并将它们带入主内存。然后,它将比较文件并计算两个相应节点之间差异的数量(不包括空格)。稍后程序会对差异做更多的事情,但我只是对如何开始比较两个单独文件中的节点感到困惑。任何建议都会非常感激。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这取决于您是否有节点差异或节点内的差异。

此代码提取所有节点及其路径,

内的价值

假设您有两个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());
    }
}

路径:给你路径

CONTENT:节点的子内容

有了这个,你可以获得xml的所有部分:你可以逐个比较,排序,并使用其他算法来查找是否插入了某些内容,...

在每个节点内,您可以进行另一次比较。

希望有所帮助