Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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# 将XDocument转换为XmlDocument,反之亦然_C#_Xml_Linq To Xml - Fatal编程技术网

C# 将XDocument转换为XmlDocument,反之亦然

C# 将XDocument转换为XmlDocument,反之亦然,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,这是我遇到的一个非常简单的问题。我使用XDocument生成XML文件。然后我想将其作为XmlDocument类返回。 我有一个XmlDocument变量,我需要将它转换回XDocument以附加更多节点 那么,在XDocument和XmlDocument之间转换XML最有效的方法是什么?(不在文件中使用任何临时存储。)您可以尝试将XDocument写入通过管道传输到XmlReader的XmlWriter,以获取XmlDocument 如果我正确理解了这些概念,直接转换是不可能的(内部结构与XD

这是我遇到的一个非常简单的问题。我使用XDocument生成XML文件。然后我想将其作为XmlDocument类返回。 我有一个XmlDocument变量,我需要将它转换回XDocument以附加更多节点


那么,在XDocument和XmlDocument之间转换XML最有效的方法是什么?(不在文件中使用任何临时存储。)

您可以尝试将XDocument写入通过管道传输到XmlReader的XmlWriter,以获取XmlDocument


如果我正确理解了这些概念,直接转换是不可能的(内部结构与XDocument不同/简化)。但是,我可能错了…

您可以使用内置的xDocument.CreateReader()和XmlNodeReader来回转换

将其放入扩展方法中,使其更易于使用

using System;
using System.Xml;
using System.Xml.Linq;

namespace MyTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {

            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml("<Root><Child>Test</Child></Root>");

            var xDocument = xmlDocument.ToXDocument();
            var newXmlDocument = xDocument.ToXmlDocument();
            Console.ReadLine();
        }
    }

    public static class DocumentExtensions
    {
        public static XmlDocument ToXmlDocument(this XDocument xDocument)
        {
            var xmlDocument = new XmlDocument();
            using(var xmlReader = xDocument.CreateReader())
            {
                xmlDocument.Load(xmlReader);
            }
            return xmlDocument;
        }

        public static XDocument ToXDocument(this XmlDocument xmlDocument)
        {
            using (var nodeReader = new XmlNodeReader(xmlDocument))
            {
                nodeReader.MoveToContent();
                return XDocument.Load(nodeReader);
            }
        }
    }
}
使用系统;
使用System.Xml;
使用System.Xml.Linq;
名称空间MyTest
{
内部课程计划
{
私有静态void Main(字符串[]args)
{
var xmlDocument=新的xmlDocument();
LoadXml(“测试”);
var xDocument=xmlDocument.ToXDocument();
var newXmlDocument=xDocument.ToXmlDocument();
Console.ReadLine();
}
}
公共静态类文档扩展
{
公共静态XmlDocument ToXmlDocument(此XDocument XDocument)
{
var xmlDocument=新的xmlDocument();
使用(var xmlReader=xDocument.CreateReader())
{
加载(xmlReader);
}
归还文件;
}
公共静态XDocument文档(此XmlDocument XmlDocument)
{
使用(var nodeReader=新的XmlNodeReader(xmlDocument))
{
noderReader.MoveToContent();
返回XDocument.Load(nodeReader);
}
}
}
}
资料来源:

    • 有一个关于


      似乎通过XmlNodeReader读取XDocument是最快的方法。有关更多详细信息,请参阅博客

      如果需要将System.Xml.Linq.XDocument的实例转换为System.Xml.XmlDocument的实例,此扩展方法将帮助您不会丢失生成的XmlDocument实例中的Xml声明

      using System.Xml; 
      using System.Xml.Linq;
      
      namespace www.dimaka.com
      { 
          internal static class LinqHelper 
          { 
              public static XmlDocument ToXmlDocument(this XDocument xDocument) 
              { 
                  var xmlDocument = new XmlDocument(); 
                  using (var reader = xDocument.CreateReader()) 
                  { 
                      xmlDocument.Load(reader); 
                  }
      
                  var xDeclaration = xDocument.Declaration; 
                  if (xDeclaration != null) 
                  { 
                      var xmlDeclaration = xmlDocument.CreateXmlDeclaration( 
                          xDeclaration.Version, 
                          xDeclaration.Encoding, 
                          xDeclaration.Standalone);
      
                      xmlDocument.InsertBefore(xmlDeclaration, xmlDocument.FirstChild); 
                  }
      
                  return xmlDocument; 
              } 
          } 
      }
      

      希望有帮助

      对我来说,这种单线解决方案非常有效

      XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
      

      如果您需要Win 10 UWP兼容型号:

      using DomXmlDocument = Windows.Data.Xml.Dom.XmlDocument;
      
          public static class DocumentExtensions
          {
              public static XmlDocument ToXmlDocument(this XDocument xDocument)
              {
                  var xmlDocument = new XmlDocument();
                  using (var xmlReader = xDocument.CreateReader())
                  {
                      xmlDocument.Load(xmlReader);
                  }
                  return xmlDocument;
              }
      
              public static DomXmlDocument ToDomXmlDocument(this XDocument xDocument)
              {
                  var xmlDocument = new DomXmlDocument();
                  using (var xmlReader = xDocument.CreateReader())
                  {
                      xmlDocument.LoadXml(xmlReader.ReadOuterXml());
                  }
                  return xmlDocument;
              }
      
              public static XDocument ToXDocument(this XmlDocument xmlDocument)
              {
                  using (var memStream = new MemoryStream())
                  {
                      using (var w = XmlWriter.Create(memStream))
                      {
                          xmlDocument.WriteContentTo(w);
                      }
                      memStream.Seek(0, SeekOrigin.Begin);
                      using (var r = XmlReader.Create(memStream))
                      {
                          return XDocument.Load(r);
                      }
                  }
              }
      
              public static XDocument ToXDocument(this DomXmlDocument xmlDocument)
              {
                  using (var memStream = new MemoryStream())
                  {
                      using (var w = XmlWriter.Create(memStream))
                      {
                          w.WriteRaw(xmlDocument.GetXml());
                      }
                      memStream.Seek(0, SeekOrigin.Begin);
                      using (var r = XmlReader.Create(memStream))
                      {
                          return XDocument.Load(r);
                      }
                  }
              }
          }
      

      您不必担心如何处理在ToXmlDocument方法中创建的读取器吗?为什么ToXDocument()包含对MoveToContent()的调用?这看起来可能会跳过文档元素前面的任何内容,例如XML文档顶部的任何注释和处理说明。@locster声明在
      XmlDocument
      (作为属性)和
      XDocument
      (作为节点)之间的处理方式不同。如果希望保留声明,则需要显式地处理它(请参见或@Dmitry的答案),不幸的是,这在Windows 10 UWP中不起作用。如果有人感兴趣的话,我已经在下面发布了我针对该平台的解决方案。不要使用它——虽然它确实可以正常工作,但效率非常低,因为它将整个XML树转换为单个字符串,然后再进行解析。请参阅本文,了解我正在使用的不同方法的基准,而不是生产代码。对我来说,简单和容易比表现更重要。