実現したいこと
C#でLINQを使ってXMLを読み込む際、
Elementを部分一致で検索したい。
前提
XML
1<Test> 2 <Item No="1"> 3 <Name>alpha</Name> 4 <Image>i.png</Image> 5 </Item> 6 <Item No="2"> 7 <Name>bravo</Name> 8 </Item> 9 <Item No="3"> 10 <Name>charlie</Name> 11 <Image>ii.png</Image> 12 </Item> 13 <Item No="4"> 14 <Name>delta</Name> 15 <Image>iii.png</Image> 16 </Item> 17 <Item No="5"> 18 <Name>echo</Name> 19 </Item> 20 <Item No="6"> 21 <Name>foxtrot</Name> 22 <Image>iv.png</Image> 23 </Item> 24 <Item No="7"> 25 <Name>golf</Name> 26 <OKImage>vi.png</OKImage> 27 <NGImage>vii.png</NGImage> 28 </Item> 29 <Item No="8"> 30 <Name>hotel</Name> 31 <DefaultImage>vii.png</DefaultImage> 32 <SpecialImage>viii.png</SpecialImage> 33 </Item> 34</Test>
上記のような構造のXMLファイルが任意のタイミングで作成されるとします。
(上記のXMLはその結果の例です。)
このファイルには <Item> 要素が複数ありますが、
それらの要素に含まれるすべての <Image> 要素の値を取得したいと考えます。
これまでは <Item No="1"> ~ <Item No="6"> のような定義であったため、
C#
1var imageNames = XElement.Load(xmlFileName) 2 .Elements("Item") 3 .Where(x => x.Element("Image") != null) 4 .Select(x => x.Element("Image")) 5 .Where(x => x.Value.Length > 0) 6 .Select(x => x.Value);
のような文を実行し、
i.png
ii.png
iii.png
iv.png
を得ていました。
発生している問題・エラーメッセージ
しかし、<Item No="7"> や <Item No="8"> にあるように、
<○○Image> のような要素が加わることになり、
上記 linq 文中の x.Element("Image") ではこれらの値が取得できなくなりました。
x.Element("*Image") のようなワイルドカードを記述できれば良いのですが、
実際にはElementをアスタリスク "*" で始めることはできません。
質問
今回のようにElementを部分一致検索するにはどのようにすれば良いでしょう。
お知恵拝借できれば幸いです。
宜しくお願い致します。
開発環境
Microsoft Windows 10 Pro Version 10.0.19045 build 19045
Microsoft Visual Studio Professional 2019 Version 16.11.20
対象フレームワーク .NET Framework Version 4.7.2
プロジェクトの種類 Windows Formアプリケーション
C#



回答1件
あなたの回答
tips
プレビュー