【发布时间】:2015-07-15 19:57:16
【问题描述】:
我正在尝试用 Java 创建一个程序,它采用两个 XML 文件(一个是另一个的更新版本)并将它们放入主内存。然后它将比较文件并计算两者中每个对应节点之间的差异数(不包括空白)。稍后程序将对差异做更多,但我只是对如何开始比较来自两个单独文件的节点感到困惑。任何建议将不胜感激。
【问题讨论】:
我正在尝试用 Java 创建一个程序,它采用两个 XML 文件(一个是另一个的更新版本)并将它们放入主内存。然后它将比较文件并计算两者中每个对应节点之间的差异数(不包括空白)。稍后程序将对差异做更多,但我只是对如何开始比较来自两个单独文件的节点感到困惑。任何建议将不胜感激。
【问题讨论】:
我的第一个建议是你可以使用XMLUnit:
Reader expected=new FileReader(...);
Reader tested=new FileReader(...);
Diff diff=XMLUnit.compareXML(expected, tested);
【讨论】:
有关在每个节点计算签名(哈希)以便于比较的算法,请参阅Detecting Changes in XML Documents。
有关元素排序无关紧要的 XML 文档的更改检测,请参阅X-Diff: An Effective Change Detection Algorithm for XML Documents。 X-Diff 算法的 Java 和 C++ 实现是available。
【讨论】:
这取决于您是否存在节点差异或节点内部差异。
此代码提取所有节点及其路径, 和里面的价值
假设,你有两个 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 的所有路径:您可以逐个比较、排序并使用其他算法来查找是否插入了某些内容,...
并且在每个节点内部,你可以进行另一个比较。
希望对你有帮助
【讨论】: