Comment obtenir la position d'indice (dans l'ordre) d'un élément XML à l'aide de LINQ?
J'ai XML exactement comme ce format:
<?xml version="1.0" encoding="utf-8"?>
<book>
<chapter>
<verse>This is verse 1</verse>
<verse>This is verse 2</verse>
<verse>This is verse 3</verse>
<verse>This is verse 4</verse>
</chapter>
<chapter>
<verse>This is verse 1</verse>
<verse>This is verse 2</verse>
</chapter>
<chapter>
<verse>This is verse 1</verse>
</chapter>
</book>
En C# à l'aide de Linq, j'ai besoin d'être en mesure d'obtenir l'élément XML d'un poste ou d'un indice, basé sur la valeur de la fonction d'état.getChapterNumber(). Par exemple, si la valeur de 4, j'ai besoin de saisir le chapitre 4 de l'élément dans le document XML.
XDocument book = XDocument.Load(string.Format("Translations/NWT/{0}.xml", state.BookName));
var verses = from chapter in book.Decendants()
where state.getChapterNumber() == (WHAT DO I PUT HERE TO MATCH THE VALUE??)
from verse in chapter.Descendants("p").Elements()
select new
{
VerseNumber = verse.Attribute("n").Value,
Text = verse.Value,
LastVerseInParagraph = verse.Parent.Elements().LastOrDefault().Value,
FirstVerseInParagraph = verse.Parent.Elements().FirstOrDefault().Value
};
S'il vous plaît aider, ce qui est vraiment important et a été me retient pendant des jours. Tout ce que je veux faire est d'être en mesure d'obtenir les versets de tout le chapitre que j'avais à choisir dans le livre.
- Pourquoi je ne peux pas dire
where chapter.Index().Value == state.getChapterNumber()
Vous devez vous connecter pour publier un commentaire.
Bien pour commencer, je ne pense pas que vous vouliez le deuxième descendant du général - que vous vouliez le deuxième chapitre, ce qui n'est pas nécessairement la même chose. Heureusement, c'est facile à faire:
EDIT: Pour le numéro de verset, utilisez la surcharge de
Select
qui fournit l'index de l'élément:Je ne pense pas que cela fait beaucoup de sens pour chaque verset d'avoir le premier et le dernier verset dans le paragraphe, personnellement. Ce n'est pas vraiment une caractéristique de ce verset, est-il?
select new
je voudrais Donc avoirVerseNumber = THE ITERATION,
au lieu de la ligne au-dessus. Aurais-je écrire quelque chose commeVerseNumber = verse.Index().Value,
Verse
qui contenait tous mes variables. Et ensuite, j'ai utilisé votre technique de ce genre.var verses = book.Descendants("c").ElementAt(state.GetChapter() - 1).Descendants("p").Elements() .Select((element, index) => new Verse { VerseNumber = (index + 1).ToString(), ScriptureText = element.Value });
Cela a parfaitement fonctionné! Merci beaucoup!Select((element, index) => new Verse { element, index });
dans le linq, sql format?from x in y where x.foo select x.bar
?) Il n'y a pas de support pour cette surcharge dans la syntaxe d'expression de requête.Une autre réponse correcte, bien que Jon Skeet la réponse est bien plus efficace, est-ce code:
À l'aide de la méthode d'extension de la notation, vous pouvez utiliser le
Select()
appel, qui vous permettront de l'index de l'élément courant comme ceci:Vous pouvez ensuite que l'accès à l'index du type anonyme, dans tout ce qui suit linq déclaration.
where book.Decendants("c").Index == state.GetChapterNumber()
en gros, je suis en tirant une valeur à partir d'une fonction correspondant à l'élément xml position sur la base de cette valeur. Pouvez-vous aider, il semble que vous avez de moi dans la bonne direction.VerseNumber = verse.Attribute("n").Value,
j'ai besoin de la VerseNumber valeur à chaque fois que l'itération à travers le nombre de versets dans le fichier XML par chapitre. Oh boy.