2011-03-22 2 views

답변

24

가있는 XmlNode에 XElement를 위해 문자열로 변환하고 다시 XElement를하는 것입니다 참조 -

+0

또한 ImportNode를 사용할 수도 있습니다. https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.importnode(v=vs.110).aspx – seabass

1

은 XElement를에서 InnerXml을 얻을 수있는 방법이 있습니다. 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); 
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

awesome :) 이것은 큰 도움이되었습니다. –

+3

I 'ToXmlNode'가'xmlDoc.DocumentElement'를 리턴하여 예상했던 동작을 얻었습니다. 특히 'XElement'에는 주석이 있지만 'XmlNode'에는 주석이 없습니다. 그렇지 않으면 매우 도움이됩니다. – tallseth

+0

'return xmlDoc;'은'return xmlDoc.FirstChild;'로 수정되어야합니다. –

2

BrokenGlass의 answer을 바탕으로, 당신은 사용하기보다, XmlDocument를에있는 XmlNode를 포함하고자하는 경우 :

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

참고 : 예외를 throw하는 것보다 다른 문서에서 만든 노드를 문서에 삽입하려고하면 "노드를 삽입하는 데는 다른 문서가 사용됩니다 xt. "

1

내가 가장 짧은 방법은 다음과 생각 :

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

그게 전부!

관련 문제