【问题标题】:Xml parsing, continuing a foreach loop in another methodxml解析,以另一种方法继续foreach循环
【发布时间】:2013-11-16 11:11:07
【问题描述】:

我有一个 XML 文件,其组织方式类似于:

<People>
    <Person>
        <Name>John</Name>
        <SurName>Smith</SurName>
    </Person>
    <Person>
        <Name>Jack</Name>
        <SurName>Woodman</SurName>
    </Person>
    [...]
</People>
<Professions>
    <Person>
        <SurName>Smith</SurName>
        <Profession>Blacksmith</Profession>
    </Person>
    <Person>
        <SurName>Woodman</SurName>
        <Profession>Lumberjack</Profession>
    </Person>
        [...]
    </Professions>

好的,我们开始吧。 我正在使用 Xml.Linq 解析它,我得到了这样的代码:

 foreach (XElement datatype in RepDoc.Element("People").Descendants("Persons"))
 {
     Name=datatype.Element("Name").Value;
     SurName=datatype.Element("SurName").Value;
 }

但是,问题是是否可以在另一个方法中打开另一个 foreach,从当前的 datatype 位置开始,而无需重新从头开始解析。 好像该方法继承了 XElement datatype,所以我可以从同一个 &lt;Person&gt;node 开始解析。

这听起来很愚蠢,但我不能放原始的 .xml,因为它很大并且包含数百万的信息,只会让我们更加困惑。

谢谢:)

【问题讨论】:

  • 是的,但目的是什么?我假设您想遍历 People 标记的后代?
  • 您可以尝试投射Descendants() 结果ToList() 并使用for 循环(使用列表的索引)。然后,嵌套的for 循环将从index+1 开始。希望我能正确理解你的问题。能否提供一些细节?
  • 我认为要做到这一点,您必须将一个列表传递给“左侧”元素的新方法。不过,这听起来很奇怪。如果您指定在另一个 foreach 中将执行的操作会有所帮助。
  • @DavidS。我用最后一段编辑了这个问题,试图解释将要做什么。 .xml 很大,所以列表是毫无疑问的。但无论如何谢谢:D

标签: c# xml parsing loops foreach


【解决方案1】:

好的,我相信您正在寻找yield。这通常会这样使用:

public IEnumerable<Person> GetPeople()
{
    foreach (XElement datatype in RepDoc.Element("People").Descendants("Persons"))
    {
        var p = new Person
        {
            Name = datatype.Element("Name").Value,
            SurName = datatype.Element("SurName").Value
        };

        yield return p;
    }
}

然后您可以像这样使用该方法:

foreach (Person p in MyClass.GetPeople())

这里的好处是您只需要读取尽可能多的 XML 文件,因为如果您跳出外循环,一切都会停止。

【讨论】:

  • 那么,这个 foreach 将开始解析数据类型停止的确切位置?
  • @ViniciusSilveira,这将一次解析一个Persons
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
相关资源
最近更新 更多