将XElement转换为XmlNode

时间:2011-03-22 10:02:32

标签: c# xml linq xelement xmlnode

我知道没有直接的做法,但仍然...... 我们可以将XElement元素转换为XmlNodeInnerTextInnerXml等选项具体为XmlNode

所以,如果我想使用这些选项,可以采取哪些措施将XElement转换为XmlNode,反之亦然。

6 个答案:

答案 0 :(得分:51)

我使用以下扩展方法,它们似乎很常见:

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

答案 1 :(得分:26)

这里是从字符串到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); 

答案 2 :(得分:3)

基于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 :(得分:2)

我认为最简短的方法是:

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

这就是全部!转换为C#是微不足道的。

答案 4 :(得分:1)

有办法从XElement获取InnerXml - 请参阅Best way to get InnerXml of an XElement?

答案 5 :(得分:1)

XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;