Je sais qu'il n'y a pas de méthode directe pour le faire mais quand même .. Pouvons-nous convertir l'élément XElement
en XmlNode
. Des options telles que InnerText
et InnerXml
sont XmlNode
spécifiques.
donc, si je veux utiliser ces options, que peut-on faire pour convertir XElement
en XmlNode
et vice versa.
Voici la conversion de chaîne en XElement en XmlNode et en arrière en XElement. ToString () sur XElement est similaire à OuterXml sur 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);
J'utilise les méthodes d'extension suivantes, elles semblent assez courantes:
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;
}
}
}
Basé sur BrokenGlass réponse , si vous souhaitez incorporer le XmlNode à un XmlDocument, utilisez:
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);
}
}
}
Remarque: si vous essayez d'insérer dans un document un noeud, qui est créé par un autre document, alors il lèvera une exception: "Le noeud à insérer provient d'un contexte de document différent."
Je pense que le chemin le plus court est le suivant:
Dim xn as XmlNode = xdoc.ReadNode(xElem.CreateReader)
C'est tout! Convertir en C # est trivial.
Il existe des façons d'obtenir InnerXml à partir de XElement - voir La meilleure façon d'obtenir InnerXml d'un XElement?
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;