c# xml linq xelement xmlnode

c# - Convertir XElement en XmlNode



linq (5)

Sé que no hay un método directo para hacerlo pero aún así ... ¿Podemos convertir el elemento XElement en XmlNode ? Las opciones como InnerText e InnerXml son específicas de XmlNode .

XElement , si quiero usar estas opciones, ¿qué se puede hacer para convertir XElement en XmlNode y viceversa?


Aquí se está convirtiendo de cadena a XElement a XmlNode y de vuelta a XElement. ToString () en XElement es similar a OuterXml en XmlNode.

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


Basado en la answer de BrokenGlass, si desea incrustar el XmlNode en un XmlDocument, entonces use:

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

Nota: si intenta insertar en un documento un nodo, creado por un documento diferente, se producirá una excepción: "El nodo que se insertará es de un contexto de documento diferente".


Creo que el camino más corto es el siguiente:

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

¡Eso es todo!



Utilizo los siguientes métodos de extensión, parecen ser bastante comunes:

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