C# 将XElement转换为XmlNode

C# 将XElement转换为XmlNode,c#,xml,linq,xelement,xmlnode,C#,Xml,Linq,Xelement,Xmlnode,我知道没有直接的方法,但是。。 我们可以将XElement元素转换为XmlNode。 像InnerText和InnerXml这样的选项是特定于XmlNode的 因此,如果我想使用这些选项,可以做些什么来将XElement转换为XmlNode,反之亦然。有一些方法可以从XElement获取InnerXml-请参见这里的从字符串到XElement再到XmlNode再到XElement的转换。XElement上的ToString()类似于XmlNode上的OuterXml XElement x

我知道没有直接的方法,但是。。 我们可以将
XElement
元素转换为
XmlNode
。 像
InnerText
InnerXml
这样的选项是特定于
XmlNode


因此,如果我想使用这些选项,可以做些什么来将
XElement
转换为
XmlNode
,反之亦然。

有一些方法可以从XElement获取InnerXml-请参见这里的从字符串到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); 
XElement xE=XElement.Parse(“”);
XmlDocument xD=新的XmlDocument();
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,如果希望将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#很简单。

awesome:)这是一个很大的帮助,我必须做出
ToXmlNode
return
xmlDoc.DocumentElement
来获得我期望的行为。特别是,我的
XElement
有注释,但我的
XmlNode
没有注释。否则非常有用。
返回xmlDoc
应更正为
返回xmlDoc.FirstChild也可以使用ImportNode
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;