私はそれを行う直接的な方法がないことを知っていますが、それでも.. XElement
要素をXmlNode
に変換できますか? InnerText
やInnerXml
などのオプションはXmlNode
固有です。
したがって、これらのオプションを使用したい場合、XElement
をXmlNode
に、またはその逆に変換するために何ができるでしょうか。
ここでは、文字列からXElement、XmlNode、XElementに変換しています。 XElementのToString()は、XmlNodeのOuterXmlに似ています。
XElement xE = XElement.Parse("<Outer><Inner><Data /></Inner></Outer>");
XmlDocument xD = new XmlDocument();
xD.LoadXml(xE.ToString());
XmlNode xN = xD.FirstChild;
XElement xE2 = XElement.Parse(xN.OuterXml);
私は次の拡張メソッドを使用していますが、それらは非常に一般的なようです:
public static class MyExtensions
{
public static XElement ToXElement(this XmlNode node)
{
XDocument xDoc = new XDocument();
using (XmlWriter xmlWriter = xDoc.CreateWriter())
node.WriteTo(xmlWriter);
return xDoc.Root;
}
public static XmlNode ToXmlNode(this XElement element)
{
using (XmlReader xmlReader = element.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}
}
BrokenGlassの answer に基づいて、XmlNodeをXmlDocumentに埋め込む場合は、以下を使用します。
public static class MyExtensions
{
public static XmlNode ToXmlNode(this XElement element, XmlDocument xmlDoc = null)
{
using (XmlReader xmlReader = element.CreateReader())
{
if(xmlDoc==null) xmlDoc = new XmlDocument();
return xmlDoc.ReadNode(xmlReader);
}
}
}
注:別のドキュメントによって作成されたノードをドキュメントに挿入しようとすると、「挿入されるノードは別のドキュメントコンテキストからのものです」という例外がスローされます。
私は最短の方法は以下の通りだと思います:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
それで全部です! C#への変換は簡単です。
XElementからInnerXmlを取得する方法はいくつかあります-参照 XElementのInnerXmlを取得する最良の方法?
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;