[英]Converting XDocument to XmlDocument and vice versa
這是我遇到的一個非常簡單的問題。 我使用 XDocument 生成一個 XML 文件。 然后我想將它作為 XmlDocument 類返回。 我有一個 XmlDocument 變量,我需要將其轉換回 XDocument 以附加更多節點。
那么,在 XDocument 和 XmlDocument 之間轉換 XML 的最有效方法是什么? (不使用文件中的任何臨時存儲。)
您可以使用內置的 xDocument.CreateReader() 和 XmlNodeReader 來回轉換。
將其放入 Extension 方法中以使其更易於使用。
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);
}
}
}
}
資料來源:
對我來說,這個單行解決方案效果很好
XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
using System.Xml;
using System.Xml.Linq;
#region Extention Method
public static XElement ToXElement(this XmlElement element)
{
return XElement.Parse(element.OuterXml);
}
public static XmlElement ToXmlElement(this XElement element)
{
var doc = new XmlDocument();
doc.LoadXml(element.ToString());
return doc.DocumentElement;
}
#endregion
而不是簡單地使用這樣的擴展來使用此擴展
System.Xml.XmlElement systemXml = (new XElement("nothing")).ToXmlElement();
System.Xml.Linq.XElement linqXml = systemXml.ToXElement();
如果您需要將 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 寫入通過管道傳輸到 XmlDocument 的 XmlReader 的 XmlWriter。
如果我正確理解這些概念,則無法直接轉換(內部結構與 XDocument 不同/簡化)。 但是,我可能錯了......
通過XmlNodeReader讀取 XDocument 似乎是最快的方法。 有關更多詳細信息,請參閱博客。
如果您需要兼容 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);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.