代码之家  ›  专栏  ›  技术社区  ›  Asmor

使用xlinq高效地“向下钻取”到XML树中?

  •  0
  • Asmor  · 技术社区  · 15 年前

    我正在编写一个程序来解析一些第三方XML文件。这种结构就像…

    <CharacterSheet>
        ...
        <StatBlock>
            ...
            <Stat>
                ...
                <alias />
                ...
            </Stat>
            ...
        </StatBlock>
        ...
    </CharacterSheet>
    

    我在中使用它来练习LINQ,最后我必须编写一些非常难看的链接查询来得到我想要的,一个统计数据列表和它们的所有别名。

    var CharSheet = from i in character.Elements()
            where i.Name == "CharacterSheet"
            select i;
    
    var StatBlocks = from sheet in CharSheet
             from statBlock in sheet.Elements()
             where statBlock.Name == "StatBlock"
             select statBlock;
    
    var stats = from statBlock in StatBlocks
            from stat in statBlock.Elements()
            select stat;
    
    var statAliases = from stat in stats
              from alias in stat.Elements()
              where alias.Name == "alias"
              select new { stat, alias };
    

    我意识到我可以用“into”把它变成一个很长的查询(这是我最初的查询方式),但这使得它更加密集和难以处理。

    似乎有一个更简单的方法来做我想做的事情。

    1 回复  |  直到 13 年前
        1
  •  6
  •   Jon Skeet    15 年前

    你可以使用 XPathSelectElements() (老实说,这可能是个更好的主意),或者您可以使用 Elements() 扩展方法:

    var query = character.Elements("CharacterSheet")
                         .Elements("StatsBlock")
                         .Elements()
                         .Elements("alias")
                         .Select(x => new { stat=x.Parent, alias=x};