Comment convertir XmlNode en XElement?
J'ai un vieux XmlNode
à base de code. mais la façon la plus simple pour résoudre ma tâche actuelle consiste à utiliser XElement
et LINQ-to-XML. Le seul problème est qu'il n'y a aucun lien direct ou évident méthode de conversion d'un XmlNode
à un XElement
dans .NET Framework.
Donc, pour commencer, je tiens à mettre en œuvre une méthode qui reçoit un XmlNode
instance et la convertit en un XElement
instance.
Comment puis-je mettre en œuvre cette conversion?
- Sont tous vos
XmlNode
instancesXmlElement
instances? - Oui, tous les
XmlNode
instances sontXmlElement
instances. - Désolé, pas tous les
XmlNode
instances sontXmlElement
instances. Ils pourraient être, par exemple,XmlComment
instances.
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes avec xmlElement.InnerXml utilisé dans d'autres réponses,
1- Vous perdrez le racine élément (bien sûr, il peut être facilement manipulé)
xElem2
sera<sub>aaa</sub>
, sans(root
)2- Vous obtiendrez d'exception si votre xml contient les nœuds de texte
XElement.Load( xmlElement.CreateNavigator().ReadSubtree() );
! C'est parfait si Vous avez besoin de les convertir à XElement les instances de laXmlElement
seulement. Mais pour unXmlComment
instanceReadSubtree()
jette:System.InvalidOperationException: Operation is not valid due to the current position of the navigator
.NodeType
de tous vosXmlNode
s est leElement
.Vous pouvez essayer d'utiliser
InnerXml
propriété deXmlElement
pour obtenir le contenu xml de votre élément, puis de l'analyser pourXElement
à l'aide deXElement.Parse
:viens de l'utiliser: XElement e = XElement.Charge(nœud.CreateReader());
J'espère que ça aide.
Exemple:
Un véritable exemple de code
Le code de l'image ci-dessus
Il y a réellement une très moyen simple de convertir un XNode à un XElement:
Si vous êtes certain à 100% que le nœud est un XElement (ou vous êtes prêt à faire face avec l'exception que s'il ne l'est pas, alors vous pouvez simplement jeter:
(XElement)node
.XmlNode
, pasXNode
.Autant que je sache, vous pouvez le faire:
<root> <sub>aaa</sub> </root>
<tag>aaa</tag>
. Je ne comprends pas ce que vous essayez de dire. BTW: vous dites: j'ai posté une réponse qui ne fonctionne que pour le cas le plus simple (même s'il n'est pas correct)<root> <sub>aaa</sub> </root>
C'est ce que vous obtenez avec mon premier exemple.