プロが教える店舗&オフィスのセキュリティ対策術

C#をつかって、XMLファイルを読み出し、値を検索しようとしていますが、ほしい情報をとることができません。もしわかる方がいましたら、ご回答よろしくおねがいします。

XMLは下記の形式で、このtableが4つ続いてあります。

<table>
<row>
<column name="Tests">Tests Textvalues</column>
</row>
<row>
<column name="A">Id</column>
<column name="B">Description</column>
<column name="C">Value</column>
</row>
<row>
<column name="A">1</column>
<column name="B">no</column>
<column name="C">34 25 E0</column>
</row>
<row>
<column name="A">2</column>
<column name="B">yes</column>
<column name="C">34 25 E1</column>
</row>
</table>
<table>.....つづく


下記のようなコードを書きました。

XElement xelement = XElement.Load(ファイルパス);
IEnumerable<XElement> tables = xelement.Elements();
foreach (XElement table in tables)
{

var name = from nm in table.Elements("row")
where (string)nm.Element("colmun").Attribute("B")== "no"              select nm;

foreach (var a in name)
{
Console.WriteLine(a);
}
}
残念ながら、このコードでは、nameの中身がからっぽです。
目的は、Bの値からCの値を検索することです。

以上、よろしくお願いします。

A 回答 (2件)

もしかして XMLファイルの構造が ルートレベルが複数(この場合tableタグ)になっていませんか?



MSXMLだと 単一ルートのファイルを想定しているようですので …

<myDS>
  <table>
    <row>
      <column name="Tests">Tests Textvalues</column>
    </row>
    <row>
      <column name="A">Id</column>
      <column name="B">Description</column>
      <column name="C">Value</column>
    </row>
    <row>
      <column name="A">1</column>
      <column name="B">no</column>
      <column name="C">34 25 E0</column>
    </row>
    <row>
      <column name="A">2</column>
      <column name="B">yes</column>
      <column name="C">34 25 E1</column>
    </row>
  </table>
  <table>
    ... つづく
  </table>
</myDS>

といった具合に ルートのタグを追加してみるとか …

または FileStreamなどで中身を取得して ルートのタグを追加するとか
TextReader rd = new StreamReader("ファイルパス")
sXml = "<ds>" + rd.ReadToEnd() + "</ds>";
rd.Close();
XElement element = XElement.Parse(sXml);

といった具合でelementを構築するとか …

この回答への補足

Rootを追加してみました。
そうすると、Rowの取得の前にもう一段階、Tableの取得がくる訳ですよね。

var name = from nms in table.Elements("table") // tableの取得
    from nm in nms.Elements("row")        // columnの取得
    from cols in nm.Elements("column")        // columnの取得
    from names in cols.Attributes("name")       // name属性の取得
    where names.Value == "B" && cols.Value == "no" // name属性の検査と columnの値の検査
        select nm;

上記のように書き換えてみたのですが、取得できませんでした。
ということで、若干あきらめて、普通にテキストとして読み込んで、
String contains とif分を駆使しようかと思っています。

補足日時:2013/11/07 07:39
    • good
    • 0

見当違いの回答かもしれませんが …


このwhere句だと <column name="A">Id</column> に対する Attributeを取得してしまうのではないかと思います

var name = from nm in table.Elements("row") // rowの取得
    from cols in nm.Elements("column")        // columnの取得
    from names in cols.Attributes("name")       // name属性の取得
    where names.Value == "B" && cols.Value == "no" // name属性の検査と columnの値の検査
        select nm;
といった具合で

この回答への補足

ありがとうございます。
fromを複数回かけることを知りませんでした。ためしにコードを書き換えて実行してみたのですが、
何も値を取得できませんでした。

補足日時:2013/10/23 22:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!