• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# Linq To XML について)

C# Linq To XMLでXMLファイルの値を検索する方法

このQ&Aのポイント
  • C#を使用して、XMLファイルの値を効率的に検索するための方法を学びます。
  • XMLファイル内の特定の要素を選択し、条件に基づいて値を検索する方法を説明します。
  • C#のLinq To XMLを使用して、XMLファイルから特定の要素をフィルタリングして値を取得する方法について解説します。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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を構築するとか …

kenpanch7
質問者

補足

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分を駆使しようかと思っています。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

見当違いの回答かもしれませんが … この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; といった具合で

kenpanch7
質問者

補足

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

関連するQ&A

専門家に質問してみよう