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