質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

1466閲覧

LINQでXMLのElementを部分一致で取得したい

Sitapper

総合スコア25

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2023/04/05 03:58

編集2023/04/05 05:16

実現したいこと

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#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2023/04/05 04:10

Where を使い、Name でフィルタリングすれば良いのでは?
退会済みユーザー

退会済みユーザー

2023/04/05 04:52

開発環境を質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で コンソールアプリをターゲットフレームワーク .NET 6.0 で作っています・・・とか)
Zuishin

2023/04/05 05:02 編集

良いか悪いか聞いても返事がないのは、それなりの扱いをしてほしいということなのか。
退会済みユーザー

退会済みユーザー

2023/04/05 05:04

> Microsoft .NET Framework Version 4.8.04084 それは何を見たのですか? ターゲットフレームワークというのは、Visual Studio のソリューションエクスプローラーでプロジェクト名を右クリックして出てくるメニューでプロパティを選んで表示すると「対象のフレームワーク (またはターゲットフレームワーク)」という項目があるので、それを見てください。 あと、何を作っているのか(コンソールアプリ? Windows Forms アプリ? その他?)も書いてください。
Sitapper

2023/04/05 05:18

ご回答ありがとうございます。 試行しています。
Zuishin

2023/04/05 05:18

アカウント多いな君。面倒だから統一しなよ。
Sitapper

2023/04/06 00:21 編集

個人で使用しているものと、メンバーで共有しているものがありまして、複数作っております。 それで特にご面倒おかけしているとは思いません。
Zuishin

2023/04/05 05:27

規約違反。
Sitapper

2023/04/05 05:29

そうでしたか。 よく理解していませんでした。 では、メンバーと協議して、整理することに致しましょう。
Zuishin

2023/04/06 00:07

確認できたら謝罪を受け入れてあげよう。
Zuishin

2023/04/06 00:22

と、書いたら謝罪を引っ込めたので、こちらも撤回。
guest

回答1

0

ベストアンサー

SQL 文の LIKE に相当するあいまい検索を Linq で行うのであれば、以下のように String.Contains メソッドを使ってはいかがですか?

products = products.Where(p => p.ProductName.Contains(searchString));


【追記】

思い違いしてました。

質問にある xml の <Image>, <OKImage>, <NGImage>, <DefaultImage>, <SpecialImage> その他名前に Image という文字列を含む要素の値をすべて取得したいということですよね?

であれば、以下のようにしてはいかがですか? (もっとスマートにできる方法はあるかも)

string xmlFileName = @"xml ファイルのパス"; var imageNames = XElement.Load(xmlFileName) .Elements("Item") .Nodes() .Where(n => n is XElement elem && elem.Name.LocalName.Contains("Image")) .Select(n => ((XElement)n).Value);

結果は:

イメージ説明

投稿2023/04/05 04:56

編集2023/04/05 06:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sitapper

2023/04/05 05:56

回答ありがとうございます。 いただいた内容を基に試している途中なのですが、 上記の文では取得する値に'searchString'が含まれる場合に有効なものではないでしょうか。 つまり、前述のXMLを例にしますと、 <Image>i.png</Image> や、 <Image>ii.png</Image> のうち、'.png'が含まれるものを取得したければ、 回答いただいた文にsearchStringに'.png'を指定すれば取得でそうな気がします。 一方、今回の場合、 <Image>a.png</Image> <XImage>bb.jpg</XImage> <JJImage>z9.bmp</JJImage> のようなパターンがあり、 それらの値をどう取得すれば良いかわからないといったものでした。 その意味でのご回答であれば、まだうまく動作していませんが、やり方が悪いということで、引き続き試行錯誤しようと思います。
退会済みユーザー

退会済みユーザー

2023/04/05 06:47

思い違いしていました。すみません。あとで回答欄に案を追記しておきます。
Sitapper

2023/04/05 07:07

繰り返し回答いただきまして、ありがとうございます。 早速試させていただいたところ、期待通りの動作をしました。 回答には見慣れない語も含まれており、これから掘り下げて理解しようと思います。 正直言いまして本業でなくスキルも低いので、大変ためになりました。 恐らくは時間を使って作成・検証くださったことと思います。 ありがとうございました。
Sitapper

2023/04/06 01:40

遅くなりましてすみません。 いただいた方法も試してみました。 リンクも付けていただいて、参考になりました。 先のSurferOnWwwさんの回答とともに、 分解して返ってくる値を確認しながら理解に努めています。 お二人ともベストアンサーにできれば良かったのですが。 たいへんありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問