2

2つの大きなxmlファイルを比較して、違いを取得したいと思います。ExamXMLやDiffDogと同じように。私が見つけた解決策は、各ファイルのすべての子ノードを同時に循環し、それらが等しいかどうかを確認することでした。しかし、それを実現する方法がわかりません...すべての子ノードとそのプロパティをループするにはどうすればよいですか?最初のファイルの最初の要素が2番目のファイルの最初の要素と等しいかどうか、最初のファイルの2番目の要素が2番目のファイルの2番目の要素と等しいかどうかを確認するにはどうすればよいですか?

2つのxmlファイルを比較するためのより良いアイデアはありますか?

4

5 に答える 5

3

私はあなたのような2つのXMLを比較するものを探していましたが、このソリューションが非常にうまく機能することがわかりました。

http://www.jevon.org/wiki/Comparing_Two_SimpleXML_Documents

それが誰かに役立つことを願っています。

于 2011-08-26T13:28:40.613 に答える
2

これはあなたにとって非常に代替的な解決策かもしれませんが、これは私がそれを行う方法です。

まず、XMLを配列に変換するために、フォーマットを配列のようなはるかに管理しやすいものにしようとします。

http://www.bytemycode.com/snippets/snippet/445/

これはまさにそれを行うためのいくつかの簡単なコードです。

次に、PHPには違いを示すことができるarray_diff()関数があります。

http://www.php.net/manual/en/function.array-diff.php

これは、違いをどのように処理する必要があるかを考えると、うまくいく場合とうまくいかない場合がありますが、違いを特定してそれに基づいて行動することを検討している場合、これは問題の非常に迅速な解決策になる可能性があります。

于 2010-12-02T18:47:14.920 に答える
2

XPathの使用を検討したことがありますか?すべての子ノードを取得する簡単な方法のようです。次に、ノードをループして、属性/textContentを比較できます。

于 2010-12-02T19:16:47.063 に答える
1

xmldiff拡張機能を試してください

http://pecl.php.net/xmldiff

これは、perlモジュールDifferenceMarkupと同じライブラリに基づいており、diff XMLドキュメントを取得し、マージすることもできます。

于 2013-10-10T08:19:48.813 に答える
0
//Child by Child XML files comparison in PHP  
//Returns an array of non matched children in variable &$reasons

$reasons = array();
$xml1 = new SimpleXMLElement(file_get_contents($xmlFile1));
$xml2 = new SimpleXMLElement(file_get_contents($xmlFile2));
$result = XMLFileComparison($xml1, $xml2, $reasons);

/**
 * XMLFileComparison
 * Discription :- This function compares XML files. Returns array
 * of nodes do not match in pass by reference parameter
 * @param $xml1 Object Node Object
 * @param $xml2 Object Node Object
 * @param &$reasons Array  pass by reference 
 * returns array of nodes do not match
 * @param $strict_comparison Bool  default False
 * @return bool <b>TRUE</b> on success or array of strings on failure.
 */
function XMLFileComparison(SimpleXMLElement $xml1, SimpleXMLElement   $xml2, &$reasons, $strict_comparison = false)        
{
    static $str;  
    // compare text content
    if ($strict_comparison) {
        if ("$xml1" != "$xml2") return "Values are not equal (strict)";
    } else {
        if (trim("$xml1") != trim("$xml2"))
                {
                    return " Values are not equal";
                }
    }


    // get all children
    $XML1ChildArray = array();
    $XML2ChildArray = array();
    foreach ($xml1->children() as $b) {
        if (!isset($XML1ChildArray[$b->getName()]))
            $XML1ChildArray[$b->getName()] = array();
        $XML1ChildArray[$b->getName()][] = $b;
    }
    foreach ($xml2->children() as $b) {
        if (!isset($XML2ChildArray[$b->getName()]))
            $XML2ChildArray[$b->getName()] = array();
        $XML2ChildArray[$b->getName()][] = $b;
    }
    //print_r($XML1ChildArray);
    //print_r($XML2ChildArray);
    // cycle over children
    if (count($XML1ChildArray) != count($XML2ChildArray)) return "mismatched children count";// Second File has less or more children names (we don't have to search through Second File's children too)
    foreach ($XML1ChildArray as $child_name => $children) {
        if (!isset($XML2ChildArray[$child_name])) return "Second file does not have child $child_name"; // Second file has none of this child
        if (count($XML1ChildArray[$child_name]) != count($XML2ChildArray[$child_name])) return "mismatched $child_name children count"; // Second file has less or more children

                print_r($child_name);
                foreach ($children as $child) {
            // do any of search2 children match?
            $found_match = false;
            //$reasons = array();
            foreach ($XML2ChildArray[$child_name] as $id => $second_child) {
                            $str = $str.$child_name.($id+1)."/"; // Adding 1 to $id to match with XML data nodes numbers
                            //print_r($child, $second_child);
                            // recursive function call until reach to the end of node
                if (($r = XMLFileComparison($child, $second_child, $reasons, $strict_comparison)) === true) {
                    // found a match: delete second
                    $found_match = true;
                    unset($XML2ChildArray[$child_name][$id]);
                                        $str = str_replace($child_name.($id+1)."/", "", $str);
                                        break;
                } 
                                else {
                                    unset($XML2ChildArray[$child_name][$id]);
                                    $reasons[$str] = $r;
                                    $str = str_replace($child_name.($id+1)."/", "", $str);
                                    break;
                }
            }

        }
    }
  return True;      
}
于 2015-09-30T23:47:22.367 に答える