我正在尝试查询XML文档并返回存储在METEDATA标记内的COUNT标记中的计数。问题是我很难访问属性strCount以便在程序中使用。我考虑过循环IEnumerable,但希望能够以更干净的方式访问他的价值。比如返回countQ.strCount我们的countQ [“strCount”]。我知道那些在这种情况下不起作用,但想说明使用我想要的值的属性的名称而不是索引或循环。
CODE
Private XDocument doc = XDocument.Load(path);
public class entityCount
{
public string strCount { get; set; }
}
public IEnumerable<entityCount> queryCount(){
var countQ = this.doc.Descendants("METADATA") .Select(m => new entityCount {
strCount = m.Element("COUNT").Value
});
return countQ.....?;
}
缩写的XML
<PRODUCTION_SET>
<METADATA>
<COUNT>322</COUNT>
</METADATA>
<ENTITY>
<METADATA>
<ID>1</ID>
<foo>x</foo>
<bar>y</bar>
</METADATA>
</ENTITY>
.
.
.
.
.
<ENTITY>
<METADATA>
<ID>322</ID>
<foo>x</foo>
<bar>y</bar>
</METADATA>
</ENTITY>
</PRODUCTION_SET>
答案 0 :(得分:3)
要获取第一个元数据标记中的计数,您可以执行以下操作:countQ.First()
如果您感兴趣的只是直接在PRODUCTION_SET中的元数据标签,您可能不应该使用后代(即使在单个实体中也会更深入地查找它,忽略上下文),而是找到PRODUCTION_SET标记,然后执行.Elements().Select(...).Single()
。 Single()与First()几乎相同,但它确保只有一个元素可供您查找。在这种情况下,代码看起来像这样:
public entityCount queryCount(){
return this.doc.Root.Elements("METADATA").Select(m => new entityCount {
strCount = m.Element("COUNT").Value
}).Single();
}
答案 1 :(得分:2)
您可以转换IEnumerable&lt; T&gt;到列表并通过索引访问元素:
int cnt = countQ.ToList()[0].strCount;
return cnt;
问题是,您的查询是否只返回一个项目?如果您知道自己只有一个项目,则可以使用First()
:
int cnt = countQ.First().strCount;
return cnt;
答案 2 :(得分:0)
您可以使用IEnumerable<T>
或First()
获取FirstOrDefault()
的第一项:
var queryCountResult = countQ.FirstOrDefault();
if(queryCountResult !=null)
{
var count = queryCountResult.strCount;
}