我正在尝试用Java创建一个带有两个XML文件的程序(一个是另一个的更新版本)并将它们带入主内存。然后,它将比较文件并计算两个相应节点之间差异的数量(不包括空格)。稍后程序会对差异做更多的事情,但我只是对如何开始比较两个单独文件中的节点感到困惑。任何建议都会非常感激。
答案 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的所有部分:你可以逐个比较,排序,并使用其他算法来查找是否插入了某些内容,...
在每个节点内,您可以进行另一次比较。
希望有所帮助