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!
Hay formas de obtener InnerXml desde XElement. ¿Ver la mejor forma de obtener InnerXml de un XElement?
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;
}
}
}