Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 写入流时使用XmlDiffPatch_C#_Xml_Stream - Fatal编程技术网

C# 写入流时使用XmlDiffPatch

C# 写入流时使用XmlDiffPatch,c#,xml,stream,C#,Xml,Stream,我正在尝试使用xmldiffpatch写入流 第一种方法是将xml写入内存流。 第二种方法从文件中加载一个xml,并创建一个流,用于将修补过的文件写入其中。第三种方法实际上是比较这两个文件。我总是发现两个文件都是相同的,即使它们不是,所以我知道我遗漏了一些东西 感谢您的帮助 public MemoryStream FirstXml() { string[] names = { "John", "Mohammed", "Marc", "Tamara", "joy" };

我正在尝试使用xmldiffpatch写入流

第一种方法是将xml写入内存流。 第二种方法从文件中加载一个xml,并创建一个流,用于将修补过的文件写入其中。第三种方法实际上是比较这两个文件。我总是发现两个文件都是相同的,即使它们不是,所以我知道我遗漏了一些东西

感谢您的帮助

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();}

    }
public MemoryStream FirstXml()
{
string[]name={“John”、“Mohammed”、“Marc”、“Tamara”、“joy”};
MemoryStream ms=新的MemoryStream();
XmlTextWriter xtw=新的XmlTextWriter(ms,Encoding.UTF8);
xtw.WriteStartDocument();
xtw.WriteStarteElement(“根”);
foreach(名称中的字符串s)
{
xtw.书面启动要素;
xtw.WriteEndElement();
}
xtw.WriteEndElement();
xtw.WriteEndDocument();
返回ms;
}
公共流SecondXml()
{
XmlReader finalFile=XmlReader.Create(@“c:\…\something.xml”);
MemoryStream ms=FirstXml();
XmlReader originalFile=XmlReader.Create(ms);
MemoryStream ms2=新的MemoryStream();
XmlTextWriter dgw=新的XmlTextWriter(ms2,Encoding.UTF8);
生成偏移图(原始文件、最终文件、dgw);
返回ms2;
}
public void GenerateDiffGram(XmlReader原始文件、XmlReader最终文件、,
XmlWriter(dgw)
{
XmlDiff XmlDiff=新的XmlDiff();
bool bIdentical=xmldiff.Compare(原始文件、最终文件、dgw);
dgw.Close();
StreamReader sr=新的StreamReader(SecondXml());
字符串xmlOutput=sr.ReadToEnd();
if(xmlOutput.Contains(“”)
{Console.WriteLine(“Xml文件不相同”);
Console.Read();}
其他的
{Console.WriteLine(“Xml文件相同”);Console.Read();}
}

以下修改版本有效

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在第一个和第二个读取器中都是空字符串。由于您正在使用内存流作为备份存储,因此您不会像上面那样仅使用字符串而丢失任何内容。

以下修改版本可以正常工作

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在第一个和第二个读取器中都是空字符串。由于您使用的是内存流作为备份存储,因此只使用字符串不会丢失任何内容。

谢谢!我想知道这对于不同的大型xml文件是否是一个可行的选择。。。然而,我认为出于分配的目的,这将是完美的。@Mark Smith,对于一个大文件,我会尝试让它与
XmlReader
s一起工作。您可能希望查看
XmlDiff
的源代码,它可能希望读卡器位于特定的节点,如根节点。要获取所需的程序集,您可以使用NuGet上的XMLDiffPatch,请参阅。谢谢!我想知道这对于不同的大型xml文件是否是一个可行的选择。。。然而,我认为出于分配的目的,这将是完美的。@Mark Smith,对于一个大文件,我会尝试让它与
XmlReader
s一起工作。您可能希望查看
XmlDiff
的源代码,它可能希望读卡器位于特定节点,如根节点。要获取此操作所需的程序集,您可以使用NuGet上的XMLDiffPatch,请参阅。