1

xmldiffpatch を使用してストリームに書き込もうとしています。

最初の方法は、xml をメモリ ストリームに書き込むことです。2 番目のメソッドは、ファイルから xml をロードし、パッチが適用されたファイルが書き込まれるストリームを作成します。3 番目の方法では、2 つのファイルを実際に比較します。両方のファイルが同一ではないにもかかわらず、常に同じであることがわかっているため、何かが欠けていることがわかります。

どんな助けでも大歓迎です!

public MemoryStream FirstXml() 

    {
        string[] names = { "John", "Mohammed", "Marc", "Tamara", "joy" };
        MemoryStream ms = new MemoryStream();
        XmlTextWriter xtw= new XmlTextWriter(ms, Encoding.UTF8);

        xtw.WriteStartDocument();
        xtw.WriteStartElement("root");

        foreach (string s in names)
        {
        xtw.WriteStartElement(s);
        xtw.WriteEndElement();
        }
        xtw.WriteEndElement();
        xtw.WriteEndDocument();
        return ms;
    }

    public Stream SecondXml()
    {
        XmlReader finalFile =XmlReader.Create(@"c:\......\something.xml");
        MemoryStream ms = FirstXml();
        XmlReader originalFile = XmlReader.Create(ms);
        MemoryStream ms2 = new MemoryStream();
        XmlTextWriter dgw = new XmlTextWriter(ms2, Encoding.UTF8);
        GenerateDiffGram(originalFile, finalFile, dgw);
        return ms2;
    }

    public void GenerateDiffGram(XmlReader originalFile, XmlReader finalFile,
                                XmlWriter dgw)
    {
        XmlDiff xmldiff = new XmlDiff();
        bool bIdentical = xmldiff.Compare(originalFile, finalFile, dgw);
        dgw.Close();
        StreamReader sr = new StreamReader(SecondXml());
        string xmlOutput = sr.ReadToEnd();
        if(xmlOutput.Contains("</xd:xmldiff>"))
        {Console.WriteLine("Xml files are not identical");
            Console.Read();}

        else
        {Console.WriteLine("Xml files are identical");Console.Read();}

    }
4

1 に答える 1

1

次の変更されたバージョンが機能します。

static void Main()
{
    SecondXml();
}

public static string FirstXml()
{
    string[] names = { "John", "Mohammed", "Marc", "Tamara", "joy" };
    var sw = new StringWriter();
    var xtw = new XmlTextWriter(sw);

    xtw.WriteStartDocument();
    xtw.WriteStartElement("root");

    foreach (string s in names)
    {
        xtw.WriteStartElement(s);
        xtw.WriteEndElement();
    }
    xtw.WriteEndElement();
    xtw.WriteEndDocument();

    return sw.ToString();
}

public static void SecondXml()
{
    string secondXml = File.ReadAllText(@"t:\something.xml");
    string firstXml = FirstXml();

    Console.WriteLine("Comparing...");

    string result = GenerateDiffGram(firstXml, secondXml);

    Console.WriteLine(result);

    Console.WriteLine();
    Console.WriteLine("Finished compare");


    Console.Out.Write(firstXml);

    Console.WriteLine();

    Console.WriteLine();

    Console.WriteLine(secondXml);
}

public static string GenerateDiffGram(string originalFile, string finalFile)
{
    var xmldiff = new XmlDiff();
    var r1 = XmlReader.Create(new StringReader(originalFile));
    var r2 = XmlReader.Create(new StringReader(finalFile));
    var sw = new StringWriter();
    var xw = new XmlTextWriter(sw) {Formatting = Formatting.Indented};
    bool bIdentical = xmldiff.Compare(r1, r2, xw);
    Console.WriteLine();
    Console.WriteLine("bIdentical: " + bIdentical);

    return sw.ToString();
}

元のコードの何が問題なのか、実際には完全にはわかりません。比較される XML は、最初のリーダーと 2 番目のリーダーの両方で空の文字列です。とにかくバッキング ストアとしてメモリ ストリームを使用しているため、上記のように文字列を使用するだけでは何も失われません。

于 2012-09-21T03:36:15.627 に答える