使用LINQ查询XML文件



我有一个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;

我试图改变元素值,认为我可能错过了一些东西,但不知何故,查询没有返回我的数据。

在我看来有四个问题。

第一个问题是,当categories元素根元素时,您正在根元素下查找categories元素。我怀疑你真的想寻找category元素而不是categories元素。 第二个问题是,您试图找到一个名为category属性。在我看来,你应该检查元素中名为category的属性name

第三个问题是具有recordname属性的类别实际上根本不是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");

相关内容

  • 没有找到相关文章

最新更新