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