我有一个xml文档,格式如下。
<?xml version="1.0" encoding="UTF-8" ?>
<Rows>
<Row>
<Field Name='PhysicalLocation'>11;#West</Field>
<Field Name='ID'>3327</Field>
</Row>
</Rows>
我正试图用它进行linq选择。
我尝试了以下内容。
XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");
var query = from item in xmlDoc.Descendants("Rows").Elements()
select new { ID = item.Attribute("ID").Value, Value = item.Attribute("PhysicalLocation").Value };
还
XDocument xmlDoc = XDocument.Load("C:\\manifest.xml");
var query = from item in xmlDoc.Descendants("Rows").Elements()
select new { ID = item.Element("ID"), Value = item.Element("PhysicalLocation") };
在这两种情况下,我似乎都很短暂。它正在生成预期的行数,但未填充值。
有人能指出我正确的方向吗?我错过了什么?
答案 0 :(得分:1)
您没有名为“PhysicalLocation”或“ID”的属性。你只有名为'姓名'的属性。
您需要在'name'属性的值上添加一个where子句来查找您的ID和PhysicalLocation
答案 1 :(得分:1)
如何尝试这样的查询:
var query =
from item in xmlDoc.Descendants("Rows").Elements()
let values = item.Elements("Field")
.ToDictionary(x => x.Attribute("Name").Value, x => x.Value)
select new
{
ID = values["ID"],
Value = values["PhysicalLocation"],
};
答案 2 :(得分:0)
试试这个:
var xd = XDocument.Load("C:\\manifest.xml");
var query = xd.Root.Descendants("Row").Elements("Field")
.Select(s => new
{
Name = (string)s.Attribute("Name"),
Value = s.Value
});
上面的代码循环遍历每个“Row”元素,然后读取“Field”元素数据。它将返回以下匿名列表:
Name = PhysicalLocation
Value = 11;#West
Name = ID
Value = 3327
要遍历查询,您可以使用以下代码:
var sb = new StringBuilder();
foreach (var i in query)
{
sb.Append("\n Name = ").Append(i.Name).Append("\n Value = ").Append(i.Value);
}
最后,要通过Field element value
查找Name
,您可以使用以下查询:
var query2 = query.Where(w => w.Name == "ID").Single().Value;
答案 3 :(得分:0)
我认为这应该可以解决问题:
var xDoc = XDocument.Parse(
@"<?xml version='1.0' encoding='UTF-8' ?>
<Rows>
<Row>
<Field Name='PhysicalLocation'>11;#West</Field>
<Field Name='ID'>3327</Field>
</Row>
</Rows>");
var res = from row in xDoc.Root.Elements("Row")
select new
{
ID = (int)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "ID"),
PhysicalLocaltion = (string)row.Elements("Field").Single(e => (string)e.Attribute("Name") == "PhysicalLocation"),
};
foreach (var r in res)
{
Console.WriteLine(r);
}
以下是循环打印的结果:
{ ID = 3327, PhysicalLocaltion = 11;#West }