我在使用xmldiff包时遇到了一些问题。我使用的是xmldiff包0.9.2;PHP 5.4.17;Apache 2.2.25。
例如,我有两个xml文件:"from.xml“和"to.xml”。
文件"from.xml“包含:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<rott>
<NDC>321</NDC>
<NDC>123</NDC>
</rott>
</root>文件"to.xml“包含:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<rott>
<NDC>123</NDC>
<NDC>321</NDC>
</rott>
</root>我使用的是代码:
$zxo = new XMLDiff\File;
$dir1 = dirname(__FILE__) . "/upload/from.xml";
$dir2 = dirname(__FILE__) . "/upload/to.xml";
$diff = $zxo->diff($dir1, $dir2);
$file = 'differences.xml';
file_put_contents($file, $diff);我在"differences.xml“文件中得到结果:
<?xml version="1.0"?>
<dm:diff xmlns:dm="http://www.locus.cz/diffmark">
<root>
<rott>
<dm:delete>
<NDC/>
</dm:delete>
<dm:copy count="1"/>
<dm:insert>
<NDC>321</NDC>
</dm:insert>
</rott>
</root>
</dm:diff>你能从哪里评论一下吗:
<dm:delete>
<NDC/>
</dm:delete>来了吗?
另外,请告诉我有没有一种方法,可以区分两个xml文件,而不是xml节点顺序的问题?
发布于 2014-02-27 09:17:05
您看到的是libdiffmark格式的差异。就在那个页面上:
在输入子树相同的地方使用
代码片段中的文档具有部分相同的子树。实际上,libdiffmark将执行的指令是
节点的顺序很重要。请考虑一下,如果忽略节点顺序,diff会是什么样子。假设你有42个节点,其中一些是相同的,它将如何应用copy指令和计数?对于diff来说,使用两个文档的确切节点顺序要容易得多。关于为什么节点顺序很重要,我在here上发现了一个有趣的读物。
谢谢。
发布于 2014-03-03 20:45:11
如果知道文档结构,我认为您可以简单地对必要的部分进行排序。这里有一个关于它的useful acticle。在此基础上,我给出了一些示例,可以根据节点值对文档进行排序(仅举个例子),请看这里
文档library.xml
<?xml version="1.0"?>
<library>
<book id="1003">
<title>Jquery MVC</title>
<author>Me</author>
<price>500</price>
</book>
<book id="1001">
<title>Php</title>
<author>Me</author>
<price>600</price>
</book>
<book id="1002">
<title>Where to use IFrame</title>
<author>Me</author>
<price>300</price>
</book>
<book id="1002">
<title>American dream</title>
<author>Hello</author>
<price>300</price>
</book>
</library>PHP代码,按
<?php
$dom = new DOMDocument();
$dom->load('library.xml');
$xp = new DOMXPath($dom);
$booklist = $xp->query('/library/book');
$books = iterator_to_array($booklist);
function sort_by_title_node($a, $b)
{
$x = $a->getElementsByTagName('title')->item(0);
$y = $b->getElementsByTagName('title')->item(0);
return strcmp($x->nodeValue, $y->nodeValue) > 0;
}
usort($books, 'sort_by_title_node');
$newdom = new DOMDocument("1.0");
$newdom->formatOutput = true;
$root = $newdom->createElement("library");
$newdom->appendChild($root);
foreach ($books as $b) {
$node = $newdom->importNode($b,true);
$root->appendChild($newdom->importNode($b,true));
}
echo $newdom->saveXML();结果如下:
<?xml version="1.0"?>
<library>
<book id="1002">
<title>American dream</title>
<author>Hello</author>
<price>300</price>
</book>
<book id="1003">
<title>Jquery MVC</title>
<author>Me</author>
<price>500</price>
</book>
<book id="1001">
<title>Php</title>
<author>Me</author>
<price>600</price>
</book>
<book id="1002">
<title>Where to use IFrame</title>
<author>Me</author>
<price>300</price>
</book>
</library>这样,您可以在比较之前对文档的各个部分进行排序。在此之后,您甚至可以直接使用DOM比较。即使您可以对节点重新排序,这也是一种类似的方法。
如果你有一个可变的节点号,我不确定它在这种情况下是否很有用。假设标签被重复了一些随机次数,它的值是完全不同的。
毕竟,我仍然认为最简单的方法是让您的请求者创建一些更可预测的文档结构:)
谢谢
Anatol
https://stackoverflow.com/questions/22042195
复制相似问题