我在使用 xmldiff 包时遇到了一些问题。我正在使用 xmldiff 包 0.9.2;菲律宾比索 5.4.17;阿帕奇 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 XMLDiffFile;
$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);
我在"差异.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节点顺序的问题?
你看到的是libdiffmark格式的差异。直接从该页面:
用于输入子树相同的位置
代码段中的文档具有部分相同的子树。实际上,libdiffmark将执行的指令是
- 删除整个子树 复制 1 个节点,
- 这意味着两个文档中的节点相同,所以不要触摸它
- 插入 1 个新节点
节点的顺序很重要。请考虑如果忽略节点顺序,差异会是什么样子。 假设您有 42 个节点,其中一些是相同的,它将如何应用带有计数的复制指令?差异更容易使用两个文档的确切节点顺序。我在这里找到的一个有趣的读物是关于为什么节点顺序很重要。
谢谢。
如果文档结构已知,我认为您可以简单地对必要的部分进行排序。这里有一个有用的方法。基于它,我已经戳了一些例子,可以按节点值对文档进行排序(仅举个例子),请看这里
文档库.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 比较。即使您可以对节点重新排序,这也是一种类似的方法。
我不确定如果你有一个可变的节点号,它会非常有用。假设
毕竟,我仍然认为最简单的方法是要求你的请求者创建一些更可预测的文档结构:)
谢谢
阿纳托尔