それは私が持っている非常に単純な問題です。 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のインスタンスに変換する必要がある場合、この拡張メソッドはXML宣言を失わないでください結果のXmlDocumentインスタンスで役立ちます:
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;
}
}
}
お役に立てば幸いです!
http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx に関する議論があります
XmlNodeReaderを介してXDocumentを読み取るのが最も速い方法のようです。詳細については、ブログを参照してください。
XmlDocumentのXmlReaderにパイプで接続されたXmlWriterにXDocumentを書き込むことができます。
概念を適切に理解していれば、直接変換することはできません(内部構造はXDocumentで異なる/簡略化されています)。しかし、その後、私は間違っているかもしれません...