2011-03-22 73 views
23

我知道没有直接的方法,但仍然可以。 我们可以将XElement元素转换为XmlNode。 选项如InnerTextInnerXml分别是XmlNode将XElement转换为XmlNode

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

回答

24

这里是从字符串转换的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); 
+0

你也可以使用ImportNode https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.importnode(v=vs.110).aspx – seabass 2018-03-07 13:23:30

45

我用下面的扩展方法,他们似乎是相当普遍:

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

真棒:)这是很大的帮助 – 2011-10-29 21:34:36

+3

我必须使'ToXmlNode'返回'xmlDoc.DocumentElement'来获得我期望的行为。特别是,我的'XElement'有注释,但是我的'XmlNode'没有注释。否则非常有帮助。 – tallseth 2014-02-21 14:03:07

+0

'return xmlDoc;'应该被修正为'return xmlDoc.FirstChild;' – 2017-09-04 07:01:41

2

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

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

1

我想在最短的方式如下:

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

这就是所有!