web-dev-qa-db-ja.com

XElementをXmlNodeに変換する

私はそれを行う直接的な方法がないことを知っていますが、それでも.. XElement要素をXmlNodeに変換できますか? InnerTextInnerXmlなどのオプションはXmlNode固有です。

したがって、これらのオプションを使用したい場合、XElementXmlNodeに、またはその逆に変換するために何ができるでしょうか。

23

ここでは、文字列から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); 
26
Wes Grant

私は次の拡張メソッドを使用していますが、それらは非常に一般的なようです:

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;
        }
    }
}
53
BrokenGlass

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);
        }
    }
}

注:別のドキュメントによって作成されたノードをドキュメントに挿入しようとすると、「挿入されるノードは別のドキュメントコンテキストからのものです」という例外がスローされます。

3
jaraics

私は最短の方法は以下の通りだと思います:

Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)

それで全部です! C#への変換は簡単です。

2
Aave

XElementからInnerXmlを取得する方法はいくつかあります-参照 XElementのInnerXmlを取得する最良の方法?

1
Stuart
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;
1
Mohini Mhetre