• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LINQ to XMLで同じ属性値の読込みについて)

LINQ to XMLで同じ属性値の読込みについて

このQ&Aのポイント
  • LINQ to XMLを使用してXMLファイルから同じ属性値を読み込む方法についての質問です。
  • 質問者はLINQ to XMLを使用して、XMLファイルから属性値が「shikaku」である要素の文字列を取得しようとしていますが、うまく取得できないという問題が発生しています。
  • また、すべての文字列を取得する方法についても知りたいとのことです。

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

  • ベストアンサー
noname#251971
noname#251971
回答No.1

「"shikaku"の部分の文字列」が何を指しているか質問文からははっきりしませんが(「部分」てどこ?)、おそらくその属性値を持つ要素の値の「応用」や「基本」などですよね? であれば、問題点はMessageBox.Show()の引数部分にあたる所かと思います。 ループ内の変数「shikaku」はvalue要素自体を表すオブジェクトなので、「(string)shikaku.Element("shikaku")」としてしまうとvalueのさらに子の「shikaku」要素値を取得しようとしてしまいます。 # 「<value type="shikaku"><shikaku>XXXXX</shikaku></value>」のようなXML構造から取得する場合の記述になっている。 value要素自体の値を取得したいのだと思うので、単に「(string)shikaku」が正しいかと思います。 質問文末尾の「すべての文字列を取得する方法」というのはちょっと意味がわかりませんのでスキップします。 # 「<?xml ....</staff_list>」までの全ファイル内容をstringに読み込みたいならば、 File.ReadAllText() が利用出来ますが。 ついでに余計なことかもしれませんが、「クエリ式」方式でLINQを利用されているようですが、当方の個人的な意見としては「メソッドチェーン」方式でLINQを使う方が書きやすく、読みやすく、保守しやすいように思います。 たとえば、(あまり実用上意味はないかもしれませんが)全staffのshikakuを重複するものをまとめて一覧化する、という場合は以下のような。 var xmlDoc = XDocument.Load(@"path/to/file.xml"); var allShikakus = xmlDoc.Root .Elements("staff") .Elements("value") .Where(elem => (string)elem.Attribute("type") == "shikaku") .Select(elem => (string)elem) .Distinct(); もうひとつ細かい点ですが、Attributeを参照する際には、.Valueプロパティを使うともしも属性が無い要素があるとNullReferenceExceptionになってしまうので、上記のようにキャストして属性値取得するほうが便利かと思います。

関連するQ&A