首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LINQ获取XML元素的位置(按顺序索引)?

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

Stack Overflow用户
提问于 2011-11-08 15:28:27
回答 3查看 14.5K关注 0票数 2

我的XML格式与以下格式完全相同:

代码语言:javascript
复制
<?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章元素。

代码语言:javascript
复制
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
             };

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-08 15:35:11

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

代码语言:javascript
复制
// 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的重载,它提供元素索引:

代码语言:javascript
复制
var verses = chapter.Element("verse")
                    .Select((element, index) => new {
                                VerseNumber = index + 1,
                                Text = element.Value
                            });

就我个人而言,我不认为每一段都有第一句和最后一句有多大意义。这不是那首诗的特色,不是吗?

票数 11
EN

Stack Overflow用户

发布于 2013-11-21 12:37:24

另一个正确的答案,尽管Jon Skeet的答案要高效得多,是这样的代码:

代码语言:javascript
复制
chapter.ElementsBeforeSelf().Count()
票数 1
EN

Stack Overflow用户

发布于 2011-11-08 15:36:04

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

代码语言:javascript
复制
var indexedChapters = book.Decendants().Select((Chapter, Index) => new { Chapter, Index });

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8047184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档