57 votes

Utiliser Linq to Xml avec des espaces de noms XML

J'ai ce code:

 /*string theXml =
@"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/

string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>";

XDocument xmlElements = XDocument.Parse(theXml);

var elements = from data in xmlElements.Descendants("Result")
               select new {
                            TheBool = (bool)data.Element("TheBool"),
                            TheId = (int)data.Element("TheId"),
                          };

foreach (var element in elements)
{
    Console.WriteLine(element.TheBool);
    Console.WriteLine(element.TheId);
}
 

Quand j'utilise la première valeur pour theXml, le résultat est nul, alors qu'avec la seconde, j'ai de bonnes valeurs ...

Comment utiliser Linq to Xml avec les valeurs xmlns?

89voto

Mike Two Points 16706

LINQ to XML méthodes comme Descendants et Element prendre XName comme argument. Il y a une conversion de l' string de XName que se passe automatiquement pour vous. Vous pouvez résoudre ce problème en ajoutant un XNamespace avant les chaînes dans votre Descendants et Element des appels. Attention parce que vous avez 2 différents espaces de noms au travail.


string theXml =
                @"true1";

            //string theXml = @"true1";

    XDocument xmlElements = XDocument.Parse( theXml );
    XNamespace ns = "http://myvalue.com";
    XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";
    var elements = from data in xmlElements.Descendants( ns + "Result" )
          select new
                 {
                     TheBool = (bool) data.Element( nsa + "TheBool" ),
                     TheId = (int) data.Element( nsa + "TheId" ),
                 };

    foreach ( var element in elements )
    {
        Console.WriteLine( element.TheBool );
        Console.WriteLine( element.TheId );
    }

Notez l'utilisation de ns en Descendants et la nsa en Elements

26voto

Lachlan Roche Points 16456

Vous pouvez passer une XName avec un espace de noms pour les Descendants() et l' Élément(). Lorsque vous passez une chaîne de Descendants(), il est implicitement converti en un XName avec aucun espace de noms.

Pour créer un XName dans un espace de noms, vous créez un XNamespace et de les enchaîner à l'élément local-nom (une chaîne).

XNamespace ns = "http://myvalue.com";
XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";

var elements = from data in xmlElements.Descendants( ns + "Result")
                   select new
                              {
                                  TheBool = (bool)data.Element( nsa + "TheBool"),
                                  TheId = (int)data.Element( nsa + "TheId"),
                              };

Il y a aussi une forme abrégée pour la création d'un XName avec un espace de noms par la conversion implicite de la chaîne.

var elements = from data in xmlElements.Descendants("{http://myvalue.com}Result")
                   select new
                              {
                                  TheBool = (bool)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheBool"),
                                  TheId = (int)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheId"),
                              };

Alternativement, vous pouvez lancer une requête contre XElement.Nom.LocalName.

var elements = from data in xmlElements.Descendants()
                   where data.Name.LocalName == "Result"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X