使用LINQ搜索xml文档时遇到麻烦

时间:2012-09-21 19:39:15

标签: c# linq

我有一个xml文档,其格式为3个元素:

<Codes>
    <Code>
        <CodeScenario>3</CodeScenario>
        <CodeScenario>4</CodeScenario>
        <CodeScenario>6</CodeScenario>
        <CodeScenario>7</CodeScenario>
        <CodeCategory>Category3</CodeCategory>
        <CodeID>043</CodeID>
        <CodeDescription>Description3</CodeDescription>
        <CodeType>PE</CodeType>
        </Code>
    <Code>
        <CodeCategory>Category2</CodeCategory>
        <CodeID>046</CodeID>
        <CodeDescription>Description2</CodeDescription>
        <CodeType>PE</CodeType>
    </Code>
    <Code>
        <CodeScenario>2</CodeScenario>
        <CodeCategory>Category1</CodeCategory>
        <CodeID>100</CodeID>
        <CodeDescription>Description1</CodeDescription>
        <CodeType>PR</CodeType>
    </Code>
</Codes>

我希望能够使用linq查询来告诉我代码元素是否具有基于ID的代码类型。这是我到目前为止所提出的。它有效,但它很难看,如果可能,我更喜欢使用点符号。有人可以帮帮我吗?

public bool HasCodeType(string CodeType, string Code)
{
    var QueryResult = (from descendant in XMLdocument.Descendants("Code")
                       from type in descendant.Elements("CodeType")
                       where type != null &&
                             type.Value.Equals(CodeType)
                       select new { CID = descendant.Element("CodeID").Value }).Distinct();

    foreach (var result in QueryResult)
    {
        if (Code == result.CID)
            return true;
    }

    return false;
}

1 个答案:

答案 0 :(得分:1)

首先找到CodeType可能最简单,然后去&#34;上下&#34;:

// Note camelCase for variable names, not PascalCase.
var query = document.Descendants("CodeType")
                    .Where(type => type.Value == codeType)
                    .Select(type => (string) type.Parent.Element("CodeID"))
                    .Where(id => id == null)
                    .Distinct();

第二个Where子句是为了避免null元素获取CodeType值而没有兄弟CodeID元素。

如果您对查询所做的一切都是检查是否存在给定ID,那么您就不需要解决所有问题:

return document.Descendants("Code")
               .Any(code => (string) code.Element("CodeType") == codeType &&
                            (string) code.Element("CodeID") == codeId));

真的简单。