我有一个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;
}
答案 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));
真的简单。