将 XElement 转换为 XmlNode

Posted

技术标签:

【中文标题】将 XElement 转换为 XmlNode【英文标题】:Converting XElement into XmlNode 【发布时间】:2011-07-20 08:36:25 【问题描述】:

我知道没有直接的方法,但仍然.. 我们可以将XElement 元素转换为XmlNodeInnerTextInnerXml 等选项是 XmlNode 特定的。

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

【问题讨论】:

有一些方法可以从 XElement 获取 InnerXml - 请参阅 ***.com/questions/3793/… 【参考方案1】:

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

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;
        
    

【讨论】:

我必须让ToXmlNode 返回xmlDoc.DocumentElement 才能得到我期望的行为。特别是,我的XElement 有注释,但我的XmlNode 没有。否则非常有帮助。 return xmlDoc; 应更正为return xmlDoc.FirstChild;【参考方案2】:

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

【讨论】:

你也可以使用 ImportNode msdn.microsoft.com/en-us/library/…【参考方案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);
        
    

注意:如果您尝试向文档中插入由不同文档创建的节点,则会引发异常:“要插入的节点来自不同的文档上下文。”

【讨论】:

【参考方案4】:

我认为最短的方法是:

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

就是这样!转换为 C# 很简单。

【讨论】:

【参考方案5】:
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;

【讨论】:

以上是关于将 XElement 转换为 XmlNode的主要内容,如果未能解决你的问题,请参考以下文章

将单个 XElement 转换为对象

如何将 XElement 转换为 XDocument

将 XElement 转换为字符串

将 XElement 的子级转换为字符串 [重复]

ASP.NET MVC4 Web API MediaTypeFormatter 转换器将 XElement 转换为 JSON

将部分 XML 字符串解析为 XElement 列表