将XElement转换为XmlNode

28

我知道没有直接的方法可以做到,但是... 我们能够将XElement元素转换为XmlNode吗? 像InnerTextInnerXml这样的选项是特定于XmlNode的。

所以,如果我想要使用这些选项,该怎么办才能将XElement转换为XmlNode,反之亦然。


从XElement获取InnerXml的方法有多种 - 请参阅https://dev59.com/L3VD5IYBdhLWcg3wXaYd - Stuart
6个回答

63

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

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

3
为了获得我期望的行为,我不得不让ToXmlNode返回xmlDoc.DocumentElement。特别地,我的XElement有注释,但我的XmlNode没有。除此之外非常有帮助。 - tallseth
return xmlDoc; should be corrected as return xmlDoc.FirstChild; - Ken Kin

28

这里将字符串转换为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 https://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument.importnode(v=vs.110).aspx - seabass

3

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

注意:如果您尝试将由不同文档创建的节点插入到文档中,那么它将抛出异常:“要插入的节点来自不同的文档上下文”。

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

2

我认为最简单的方法是按照以下步骤进行:

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

就这样!转换为C#很容易。


我试图复制这个,但是XML文档总是空的。 - Thoker
@Thoker也许原因是xdoc为空?其中xdoc是您的XML文档。 - Aave

0
“反之亦然”在C#中非常简单,除非我漏掉了什么:
`My_XML_Element = (XmlElement) My_XML_Node;`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接