2011-03-22 69 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) 

這就是所有!