web-dev-qa-db-fra.com

Conversion de XElement en XmlNode

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.

23
Sangram Nandkhile

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); 
26
Wes Grant

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;
        }
    }
}
53
BrokenGlass

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."

3
jaraics

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.

2
Aave

Il existe des façons d'obtenir InnerXml à partir de XElement - voir La meilleure façon d'obtenir InnerXml d'un XElement?

1
Stuart
XElement xelement = GetXElement();
XmlNode node = new XmlDocument().ReadNode(xelement.CreateReader()) as XmlNode;
1
Mohini Mhetre