【问题标题】:XmlReader,XmlWriter - concat xmlFiles using streamsXmlReader,XmlWriter - 使用流连接 xmlFiles
【发布时间】:2016-06-22 10:37:56
【问题描述】:

我有一些返回 xml 文件的程序。

是否可以仅使用流连接多个 xml 文件?

类似这样的:

     XmlWriter writer = XmlWriter.Create(sb,settings)
     {

          foreach(var cmd in XmlFiles)
          {
             using (XmlReader r = cmd.ExecuteXmlReader())
             {
                  while (r.Read())
                  {
                         string xml = r.ReadOuterXml();
                         writer.WriteRaw(xml);
                   }
              }
          }

     }

我需要在不使用字符串的情况下执行此操作,因为我必须处理大文件。

【问题讨论】:

  • 您不能仅仅连接两个 XML 文件来生成一个新的 XML 文件,因为这样做会违反某些要求(例如只有一个根元素)。例如。你试图生成的不是 XML(尽管表面上很相似),所以你不应该期望 XML 工具能够生成它。
  • 所以没有简单的方法像这样连接 ...... 以获得 ...... 使用流?

标签: c# xml xmlreader memorystream xmlwriter


【解决方案1】:

如果您不想使用字符串,那么为什么要使用ReadOuterXmlWriteRaw?有一个方法WriteNode 消耗传入的XmlReader,例如这样做

        string[] inputFiles = { "XMLFile1.xml", "XMLFile2.xml" };

        using (XmlWriter xw = XmlWriter.Create("result.xml"))
        {
            xw.WriteStartDocument();
            xw.WriteStartElement("root");
            foreach (string inputFile in inputFiles)
            {
                using (XmlReader xr = XmlReader.Create(inputFile))
                {
                    xr.MoveToContent();
                    xw.WriteNode(xr, true);
                }
            }
            xw.WriteEndElement();
            xw.WriteEndDocument();

将创建一个带有root 元素的新XML 文档,该元素包含两个XML 文件的内容。

因此,您可以在您的代码中使用

      foreach(var cmd in XmlFiles)
      {
         using (XmlReader r = cmd.ExecuteXmlReader())
         {
              r.MoveToContent();
              writer.WriteNode(r, false);
          }
      }

只要您确保输出的是根元素包装器(或者您使用带有 XmlWriterSettings 和 ConformanceLevel.Fragment 的 XmlWriter)。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2011-07-11
  • 2013-10-17
相关资源
最近更新 更多