Sé que no hay ningún método directo de hacerlo pero aún así..
Podemos convertir XElement elemento en XmlNode.
Opciones como InnerText y InnerXml son XmlNode específicos.

así que,si quiero utilizar estas opciones, ¿qué se puede hacer para convertir XElement en XmlNode y viceversa.

6 Comentarios

  1. 26

    Aquí es la conversión 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); 
  2. 52

    Puedo usar los siguientes métodos de extensión, que parece ser bastante común:

    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;
            }
        }
    }
    • impresionante 🙂 esto fue de gran ayuda
    • Tuve que hacer ToXmlNode volver xmlDoc.DocumentElement para obtener el comportamiento esperado. En particular, mi XElement había anotaciones, pero mi XmlNode no. Por lo demás, muy útil.
    • return xmlDoc; debe ser corregido como return xmlDoc.FirstChild;
  3. 3

    Basado en BrokenGlass del respuesta, si desea incrustar el XmlNode a un XmlDocument, de uso:

    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 de un nodo, que se crea un documento diferente, que generará una excepción: «El nodo que se inserta es de un documento diferente contexto.»

  4. 2

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

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

    ¡Eso es todo! Convertir a C# es trivial.

  5. 1
    XElement xelement = GetXElement();
    XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;

Dejar respuesta

Please enter your comment!
Please enter your name here