我有一个XML文件,我想用LINQ查询。我想为每条记录创建一个新行。这是我迄今为止尝试过但失败的原因。
<?xml version="1.0" encoding="utf-8"?>
<categories xmlns="urn:schemas-pi-meta:categories" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:schemas-pi-meta:categories Xsd/meta.xml.config.xsd">
<category name="history">
<data>
<value name="customer">2</value>
<value name="truck">1</value>
</data>
<category name="record">
<data>
<value name="time">1/3/2013 2:22:41 PM</value>
<value name="quantity">3</value>
<value name="unit">barrels</value>
<value name="cancelled">false</value>
<value name="errored">false</value>
</data>
</category>
</category>
文件较长,所以我将其剪下来,但它会重复。
这就是我试图做的事情:
XElement root = XElement.Load("D:\\Linq XM\\history.xml.config");
IEnumerable<XElement> address = from el in root.Elements("categories")
where (string)el.Attribute("category") == "record"
select el;
我试图改变Elements值,认为我可能会遗漏某些东西,但不知何故查询并没有返回我的数据。
答案 0 :(得分:8)
据我所知,有四个问题。
第一个问题是,当categories
元素 根元素时,您正在根元素下查找categories
元素 。我怀疑你真的想要寻找category
元素而不是categories
元素。
第二个问题是您正在尝试查找名为category
的属性。在我看来,您应该在名为name
的元素中检查名为category
的属性。
第三个问题是name
属性为record
的类别实际上并不是categories
的直接子元素 - 它是后代,但不是直接的孩子 - 所以你应该使用Descendants
代替Elements
。
第四个问题是你没有指定命名空间。这部分文件:
<categories xmlns="urn:schemas-pi-meta:categories" ...
指定此元素和后代的默认命名空间是URI "urn:schemas-pi-meta:categories"
。因此,当你说出你要找的东西时,你需要指明它。
把这些放在一起,你会得到:
XNamespace ns = "urn:schemas-pi-meta:categories";
var query = from el in root.Descendants(ns + "category")
where (string) el.Attribute("name") == "record"
select el;
或者没有查询表达式(因为它比这里更值得麻烦):
XNamespace ns = "urn:schemas-pi-meta:categories";
var query = root.Descendants(ns + "category")
.Where(el => (string) el.Attribute("name") == "record");