2

次のテストは失敗します。r1 に山かっこがないようですが、方法を知っている人はいますか? ある種のエンコーディングエラーだと思いますか?

var nav1 = XElement.Load(stream).CreateNavigator(); 
var nav2 = new XPathDocument(stream).CreateNavigator();

using (var r1 = new StringWriter())
using (var r2 = new StringWriter())
{
  xslt.Transform(nav1, null, r1);
  xslt.Transform(nav2, null, r2);

  r1.ToString().Should().Equal(r2.ToString());
}

ここでの問題は、意味的には同等であるが字句的に異なるxmlであると言える限りではありませんが、r1の場合の結果のxmlにはxmlタグがありません。興味深いことに、使用しvar nav3 = XElement.Load(stream).CreateReader();ても問題なく動作します。

4

2 に答える 2

2

文字列表現を使用して 2 つの XML ドキュメントを比較することはお勧めできません。2 つのドキュメントは同等である可能性がありますが、多くの語彙上の違いが存在する可能性があります。

  • 同じ名前空間にバインドされた異なるプレフィックス。
  • CDATA セクションを使用する/使用しない
  • 継承された名前空間ノードを文字列として表現/非表現
  • 引用符とアポストロフィを使用する
  • 文字エンティティを使用するか使用しないか。
  • ...など

これを行うためのより良い方法をお勧めします。多くのxmldiff ツールがあります。この質問に対する私の回答に基づいて、独自の XML 比較ツールを作成することもできます (私が自分で行ったように) 。

更新

OPからの説明の後:

「ここでの問題は、意味的には同等であるが字句的に異なるxmlであると言える限りではありませんが、r1の場合の結果のxmlにはxmlタグがありません」

私は調査し、次の結論に達しました

XslCompiledTransform.Transform(IXPathNavigable, XsltArgumentList, Stream)は、MSDN ドキュメント で説明されているように、XmlDocument または XPathDocument を最初の引数として使用します。

Parameters     
   inputType: System.Xml.XPath.IXPathNavigable An object    
              implementing the IXPathNavigable interface. In the Microsoft .NET Framework, this
              can  be either an XmlNode (typically an XmlDocument), or 
              an XPathDocument containing the data to be transformed.

XElement から作成された Navigator は明らかにこのカテゴリに当てはまらないため、報告された問題が観察されます。

解決策:

変化する:

var nav1 = XElement.Load(stream).CreateNavigator();

に:

var nav1 = XDocument.Load(stream).CreateNavigator();

      

期待どおりに動作することが確認された完全なコードを次に示します

using System.IO;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Xml.Xsl;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestLINQ_Xml
{
    class Program
    {
        static void Main(string[] args)
        {
            test();
        }

        static void test()
        {
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(@"C:\temp\delete\XSLT.xsl");

            FileStream stream = 
              new FileStream(@"C:\temp\delete\sourceXML.xml", FileMode.Open);

            var xdoc = XDocument.Load(stream);
            var nav1 = xdoc.CreateNavigator();

            stream.Seek(0L, SeekOrigin.Begin);
            var nav2 = new XPathDocument(stream).CreateNavigator(); 

            using (var r1 = new StringWriter()) using (var r2 = new StringWriter()) 
            {   xslt.Transform(nav2, null, r1); 
                xslt.Transform(nav1, null, r2); 

                string  res1 = r1.ToString();
                string  res2 = r2.ToString();

                Assert.AreEqual(res1, res2);
            } 
        }
    }
}
于 2011-09-12T12:21:29.213 に答える
0

私はあなたの結果を再現しました。私の入力 XML には 2 つの名前空間が含まれており、出力 XML では名前空間が異なる順序で定義されています。出力をバイトごとにチェックして、違いを見つけることができます。

于 2011-09-12T05:30:02.023 に答える