文字列表現を使用して 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);
}
}
}
}