web-dev-qa-db-fra.com

Comment convertir XmlNode en XElement?

J'ai un ancien code basé sur XmlNode. mais la façon la plus simple de résoudre ma tâche actuelle est d'utiliser XElement et LINQ-to-XML. Le seul problème est qu'il n'y a pas de méthode directe ou évidente pour convertir un XmlNode en XElement dans .NET Framework.

Donc pour commencer, je veux implémenter une méthode qui reçoit une instance XmlNode et la convertit en une instance XElement.

Comment puis-je implémenter cette conversion?

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

Il y a deux problèmes avec xmlElement.InnerXml utilisé dans une autre réponse,

1 - Vous perdrez l'élément racine (Bien sûr, il peut être manipulé facilement)

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 sera <sub>aaa</sub>, sans (root)

2 - Vous obtiendrez une exception si votre xml contient des nœuds de texte

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
18
EZI

Vous pouvez essayer d'utiliser InnerXml propriété de XmlElement pour obtenir le contenu xml de votre élément, puis l'analyser en XElement en utilisant XElement.Parse :

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