Puis-je éviter d'avoir à utiliser des noms d'éléments entièrement qualifiés dans LINQ to XML?
-
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?
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");