如何使用LINQ获取XML元素的位置(按顺序索引)

本文关键字:位置 顺序索引 元素 何使用 LINQ 获取 XML | 更新日期: 2023-09-27 18:13:53

我有一个完全像这样的XML格式:

<?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>

在使用Linq的c#中,我需要能够根据函数state.getChapterNumber()的值获得特定位置或索引的XML元素。例如,如果值为4,则需要从XML文档中获取第4章元素。

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
             };

请帮忙,这件事真的很重要,这几天一直拖着我的后腿。我所要做的就是能够从我在书中选择的任何章节集中获得经文。

如何使用LINQ获取XML元素的位置(按顺序索引)

首先,我不认为你想要整个的第二个后代——你想要第二个章节,这并不一定是一回事。幸运的是,这很容易做到:

// Use 1 for the second chapter, 2 for "element 2" (i.e. the third element) etc
var chapter = book.Descendants("chapter").ElementAt(1);
var verses = from verse in chapter...

编辑:对于诗句数,使用提供元素索引的Select的重载:

var verses = chapter.Element("verse")
                    .Select((element, index) => new {
                                VerseNumber = index + 1,
                                Text = element.Value
                            });

我个人认为每个诗句在段落中有第一节和最后一节是没有多大意义的。这并不是那首诗的特色,对吧?

另一个正确答案,尽管Jon Skeet的答案更有效,是这个代码:

chapter.ElementsBeforeSelf().Count()

通过使用扩展方法表示法,您可以使用Select()调用,它将为您提供当前元素的索引,如下所示:

var indexedChapters = book.Decendants().Select((Chapter, Index) => new { Chapter, Index });

之后,您可以在下面的任何linq语句中访问匿名类型的索引。