1

LINQでクエリしたいXMLファイルがあります。すべてのレコードに対して、新しい行を作成します。これが私がこれまで試したが失敗したことです。

<?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の値を変更しようとしましたが、どういうわけかクエリがデータを返していません。

4

1 に答える 1

8

私が見る限り、4つの問題があります。

最初の問題は、要素ルート要素である場合に、ルート要素のcategoriesにある要素を探していることです。要素ではなく要素を本当に探しているのではないかと思います。categoriescategorycategories

2 番目の問題は、という名前の属性を見つけようとしていることですcategory。と呼ばれる要素name内で名前が付けられた属性をチェックする必要があるように思えます。category

name3 つ目の問題は、属性がのカテゴリは、record実際には の直接の子要素ではなくcategories子孫Descendantsであり、直接の子要素ではないことです。そのため、 の代わりに を使用する必要がありElementsます。

4 番目の問題は、名前空間を指定していないことです。ファイルのこの部分:

<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");
于 2013-01-06T02:44:38.293 に答える