Puis-je éviter d'avoir à utiliser des noms d'éléments entièrement qualifiés dans LINQ to XML?

StackOverflow https://stackoverflow.com/questions/898394

  •  23-08-2019
  •  | 
  •  

Question

Dire que j'appelle XElement.Parse () avec la chaîne XML suivant:

var xml = XElement.Parse(@"
  <?xml version="1.0" encoding="UTF-8"?>
  <AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Owner>
      <ID>7c75442509c41100b6a413b88b523bd6f46554cdbee5b6cbe27bc08cb3f6a865</ID>
      <DisplayName>me</DisplayName>
    </Owner>
    <AccessControlList>
      <Grant>
        <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
      ...
  ");

Quand vient le temps d'interroger l'élément, je suis obligé d'utiliser des noms d'éléments entièrement qualifiés, car ce document XML contient un attribut xmlns dans sa racine. Cela nécessite des créations lourdes des instances XNAME:

var AWS_XMLNS = "http://s3.amazonaws.com/doc/2006-03-01/";
var ownerElement = xml.Element(XName.Get("AccessControlPolicy", AWS_XMLNS)).Element(XName.Get("Owner", AWS_XMLNS));

Quand ce que je veux vraiment est tout simplement,

var ownerElement = xml.Element("AccessControlPolicy").Element("Owner");

Y at-il un moyen de faire LINQ to XML supposer un espace de nom spécifique, donc je ne doit pas garder le spécifier?

Était-ce utile?

La solution

Je ne pense pas que vous pouvez (voir Jon Skeet commentaire), mais il y a quelques trucs que vous pouvez faire.

1) créer une méthode d'extension qui ajoute le XNamespace à votre chaîne

2) Utiliser VB ?!?

Autres conseils

Vous pouvez simplifier en utilisant

XNamespace ns = "http://s3.amazonaws.com/doc/2006-03-01/";
var ownerElement = xml.Element(ns + "AccessControlPolicy").Element(ns + "Owner");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top