首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php上的xmldiff问题

php上的xmldiff问题
EN

Stack Overflow用户
提问于 2014-02-26 21:00:18
回答 2查看 1.9K关注 0票数 0

我在使用xmldiff包时遇到了一些问题。我使用的是xmldiff包0.9.2;PHP 5.4.17;Apache 2.2.25。

例如,我有两个xml文件:"from.xml“和"to.xml”。

文件"from.xml“包含:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> 
<root>  
 <rott>   
  <NDC>321</NDC> 
  <NDC>123</NDC>  
 </rott>   
</root>

文件"to.xml“包含:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <rott>
  <NDC>123</NDC>
  <NDC>321</NDC>
 </rott>  
</root>

我使用的是代码:

代码语言:javascript
复制
$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“文件中得到结果:

代码语言:javascript
复制
<?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>

你能从哪里评论一下吗:

代码语言:javascript
复制
<dm:delete>
  <NDC/>
</dm:delete>

来了吗?

另外,请告诉我有没有一种方法,可以区分两个xml文件,而不是xml节点顺序的问题?

EN

回答 2

Stack Overflow用户

发布于 2014-02-27 09:17:05

您看到的是libdiffmark格式的差异。就在那个页面上:

在输入子树相同的地方使用

代码片段中的文档具有部分相同的子树。实际上,libdiffmark将执行的指令是

  • 删除整个子树
  • 1个节点,这意味着节点在两个文档中是相同的,所以不要碰它
  • 插入1个新节点

节点的顺序很重要。请考虑一下,如果忽略节点顺序,diff会是什么样子。假设你有42个节点,其中一些是相同的,它将如何应用copy指令和计数?对于diff来说,使用两个文档的确切节点顺序要容易得多。关于为什么节点顺序很重要,我在here上发现了一个有趣的读物。

谢谢。

票数 2
EN

Stack Overflow用户

发布于 2014-03-03 20:45:11

如果知道文档结构,我认为您可以简单地对必要的部分进行排序。这里有一个关于它的useful acticle。在此基础上,我给出了一些示例,可以根据节点值对文档进行排序(仅举个例子),请看这里

文档library.xml

代码语言:javascript
复制
<?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代码,按

代码语言:javascript
复制
<?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();

结果如下:

代码语言:javascript
复制
<?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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22042195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档