6
votes

LINQ-XML est-il toujours si désordonné?

<Items>
    <Item>
        <Id></Id>
        <Name></Name>
        <Description></Description>
        <Price></Price>
    </Item>
</Items>

5 commentaires

Essayez de faire cela en utilisant xmlreader, voire l'ancien DOM XML, et vous réévaluerez votre vision de "Messy". ;)


La syntaxe ici serait tellement plus propre avec dynamique. Imaginez id = item.id , etc.


@Noldorin - 'Désiry' serait plus approprié alors;) Mon travail avec Xmlreader dans le passé, maintenant c'était en désordre.


Si vous avez l'utilisation des XSDS, vous pouvez utiliser LINQ vers XSD (sur CodEpex) pour générer une bibliothèque bien dactylographiée.


Oui, assez juste. Je suppose que vous avez votre réponse au moins, de toute façon. :)


4 Réponses :


1
votes

Je suppose que vous avez également un nœud "articles"?

Vous pouvez faire quelque chose comme ça, en supposant que vous chargez le document à l'aide de xelement.load () P>

var subset = from item in document.Elements("Item")
             where item.Element("Id").Value == itemId.ToString()
             select new PurchaseItem() {
                 Id = int.Parse(item.Element("Id").Value),
                 Name = item.Element("Name").Value,
                 Description = item.Element("Description").Value,
                 Price = int.Parse(item.Element("Price").Value)
             };


0 commentaires

13
votes

En réalité, il serait mieux imo de lancer que d'appeler int.parse . Voici comment j'écrirais votre requête: xxx


4 commentaires

John, tout commentaire sur pourquoi le faire de cette façon, plutôt que la façon dont je le montre?


@Jon - Comment ça se passe .Value n'est pas nécessaire? Est-ce appelé implicitement dans les coulisses?


XElement définit les opérateurs de coulée personnalisés pour les types de données communs. Ainsi, lorsque vous lancez un xelement, vous appelez vraiment l'un de ces opérateurs, qui lit la valeur et la convertit. Vous vous abstenez d'appeler explicitement .value pour deux raisons: une, la valeur est une chaîne, et ces opérateurs personnalisés sont définis sur xelement, pas de chaîne. Deux, la coulée d'un xelement qui se trouve être NULL retournera simplement NULL, tout en appelant .Valuer sur un xellement null provoquera une exception. Utile lors du filtrage.


@Mitchel: J'ai essayé de rester aussi près que possible de l'original en termes de recherche elle-même, simplement de la simplifier.



1
votes

Dans votre exemple, vous pouvez ranger un peu un peu en trouvant l'élément <élément /> plutôt que le pour éviter d'obtenir le parent à chaque fois: xxx


1 commentaires

J'avais finalement ceci, mais l'a changé après avoir joué avec le code. Donc +1 pour me montrer que cela peut être fait.



1
votes

envisagez de rédiger un nouveau constructeur pour RequilletItem code> qui prend l'élément XML, vous pouvez donc écrire:

select new PurchaseItem(item.Parent);


0 commentaires