xdocument tutorial query net manejo leer example ejemplos c# .net linq linq-to-xml

tutorial - system xml linq example c#



¿Cómo convertir XmlNode en XElement? (5)

Tengo un código antiguo basado en XmlNode . pero la forma más sencilla de resolver mi tarea actual es usar XElement y LINQ-to-XML. El único problema es que no hay un método directo u obvio para convertir un XmlNode en un XElement en .NET Framework.

Entonces, para empezar, quiero implementar un método que reciba una instancia de XmlNode y la convierta en una instancia de XElement .

¿Cómo puedo implementar esta conversión?


En realidad, hay una forma muy sencilla de convertir un XNode en un XElement:

static XElement ToXElement( XNode node) { return node as XElement; // returns null if node is not an XElement }

Si está 100% seguro de que el nodo es un XElement (o está preparado para lidiar con la excepción si no lo es, simplemente puede (XElement)node : (XElement)node .


Por lo que sé, puedes hacer esto:

XElement xdoc = new XElement(node.Name, node.InnerXml);


Puede intentar usar la propiedad InnerXml de XmlElement para obtener el contenido xml de su elemento y luego analizarlo a XElement usando XElement.Parse :

public static XElement ToXELement(this XmlElement source) { return XElement.Parse(source.InnerXml); }


solo úselo : XElement e = XElement .Load (node.CreateReader ());

Espero que eso ayude.

Ejemplo:

Un ejemplo de código real El código de imagen de arriba

GetNodeByFilter estático público de XNode (nodo de XNode, filtro de lista de orden de referencia, posición int = 1) {

Resultado del nodo X = nulo;

if (filter.TryGetValue(position, out XMLSearchCriteria criteria)) { while (node != null) { XElement e = XElement.Load(node.CreateReader()); if (e.Name.LocalName.Equals(criteria.Node) && CheckIfAllAttributesMatch(e.Attributes(), criteria.Attributes)) { if (++position <= filter.Count) { result = GetNodeByFilter(e.FirstNode, ref filter, position); break; } else { result = node; } } node = node.NextNode; } } return result; }


var xElem = XElement.Load( xmlElement.CreateNavigator().ReadSubtree() );

Hay dos problemas con xmlElement.InnerXml usado en otra respuesta,

1- Perderá el elemento raíz (Por supuesto, puede manejarse fácilmente)

XmlDocument doc = new XmlDocument(); doc.LoadXml("<root> <sub>aaa</sub> </root>"); var xElem1 = XElement.Load(doc.DocumentElement.CreateNavigator().ReadSubtree()); var xElem2 = XElement.Parse(doc.DocumentElement.InnerXml);

xElem2 será <sub>aaa</sub> , sin ( root )

2- Obtendrás una excepción si tu xml contiene nodos de texto

XmlDocument doc = new XmlDocument(); doc.LoadXml("<root> text <sub>aaa</sub> </root>"); var xElem1 = XElement.Load(doc.DocumentElement.CreateNavigator().ReadSubtree()); var xElem2 = XElement.Parse(doc.DocumentElement.InnerXml); //<-- XmlException