J'ai un fichier XML comme ceci:Une meilleure solution que element.Elements ("Whatever"). First()?
<SiteConfig>
<Sites>
<Site Identifier="a" />
<Site Identifier="b" />
<Site Identifier="c" />
</Sites>
</SiteConfig>
Le fichier est modifiable par l'utilisateur, donc je veux donner un message d'erreur raisonnable au cas où je ne peux pas analyser correctement il. Je pourrais probablement écrire un .xsd pour cela, mais cela semble un peu exagéré pour un simple fichier.
De toute façon, lors de l'interrogation de la liste des <Site>
noeuds, il y a deux façons je pouvais le faire:
var doc = XDocument.Load(...);
var siteNodes = from siteNode in
doc.Element("SiteConfig").Element("Sites").Elements("Site")
select siteNode;
Mais le problème est que si l'utilisateur n'a pas inclus le noeud <SiteUrls>
(disons) il va juste jeter un NullReferenceException
qui ne dit pas grand-chose à l'utilisateur sur ce qui s'est vraiment mal passé.
Une autre possibilité est juste d'utiliser Elements()
partout au lieu de Element()
, mais cela ne fonctionne pas toujours lorsqu'il est couplé avec des appels à Attribute()
, par exemple, dans la situation suivante:
var siteNodes = from siteNode in
doc.Elements("SiteConfig")
.Elements("Sites")
.Elements("Site")
where siteNode.Attribute("Identifier").Value == "a"
select siteNode;
(C'est, Y a-t-il quelque chose de intégré au cadre pour gérer un peu mieux cette situation? Ce que je préférerais une version de Element()
(et de Attribute()
pendant que nous y sommes) qui renvoie une exception descriptive (par exemple, « Looking for élément <xyz> sous <abc> mais aucun élément n'a été trouvé ») au lieu de retourner null
.
Je pourrais écrire ma propre version de Element()
et Attribute()
, mais il me semble comme cela est un tel scénario commun que je dois manquer quelque chose ...
mai souhaitez mettre à jour votre exemple XML ci-dessus - il n'y a pas 'élément SiteURLs' liste. –
@Otaku: D'un autre côté, peut-être qu'il ne devrait pas le changer car il montre exactement le problème qu'il veut résoudre. –
Otaku: Désolé, c'était une erreur cut'n'paste de mon projet :-) –