0

xmlを含む2つの.NET文字列を比較しようとしています

<FIRST_NAME type="CHAR" />

<FIRST_NAME type="CHAR"></FIRST_NAME>

それらを(文字列として)そのまま比較すると、falseになります。XMLでは機能的に同じものであるため、比較の結果がtrueになるようにします。これらの2つの項目(および、終了タグが欠落しているか存在しているという違いがある他の項目)の比較がtrueを返すには、何をする必要がありますか?

最終結果がtrueを返す関数/メソッドである限り、文字列からある種のXMLオブジェクト/タイプにキャストすることは問題ないことに注意してください。

4

3 に答える 3

3

.NETに組み込まれているXMLデジタル署名機能には、XmlDsigC14NTransformと呼ばれるクラスが含まれています。このクラスの目的は、XMLを正規表現に変換して、2つのブロックが等しいかどうかを比較できるようにすることです。とりわけ、自己終了要素を正規化します。サポートされているさまざまな形式の正規化について詳しく読むことができます。

したがって、両方の文字列を2つのXmlDocumentインスタンスに解析し、それぞれを変換(LoadInput/GetOutput)で実行してから、2つの出力を比較します。

        void Test()
        {
            string xml1 = @"<FIRST_NAME type=""CHAR"" />";
            string xml2 = @"<FIRST_NAME type='CHAR'></FIRST_NAME>";
            bool areEqual = Compare(xml1,xml2);
        }

        bool Compare(string xml1, string xml2)
        {            
            return Canonicalize(xml1).Equals(Canonicalize(xml2));            
        }

        string Canonicalize(string xml)
        {
            var doc = new XmlDocument();
            doc.LoadXml(xml);
            var xmlTransform = new XmlDsigC14NTransform(true) { Algorithm = SignedXml.XmlDsigExcC14NTransformUrl };
            xmlTransform.LoadInput(doc);
            using( var stream = (Stream)xmlTransform.GetOutput(typeof(Stream)))
            {
                var docOut = new XmlDocument();
                docOut.Load(stream);
                return docOut.DocumentElement.OuterXml;
            }
        }
于 2012-07-11T16:53:02.597 に答える
0

Microsoft XML Diffを使用する:次のリンクを参照してください:

于 2012-07-11T17:38:52.300 に答える
0

XPath 2.0(またはXQuery 1.0)のdeep-equal()関数を使用して、両方のドキュメントを解析し、結果のドキュメントノードを比較できます。

于 2012-07-11T21:34:41.150 に答える