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

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

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

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

2403閲覧

XMLの部分削除について教えてください。.NET C# visualstudio

shosa

総合スコア1

XML

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

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2022/01/11 02:28

編集2022/01/11 03:02

前提・実現したいこと

C#を使用して、xmlを編集するプログラムを作成しています。
その中で、xmlに関する処理につまづいており、ご教授いただければ幸いです。

つまづいている箇所は、xmlの削除処理の部分についてです。

「検索条件」に該当する「名前」を持ったxmlデータから[member]を削除する方法を実装しようとしていましたが、うまくいきません。

●【実現したい例】以下のようなxmlファイルがあります。

<?xml version="1.0" encoding="utf-8"?>

<チーム>
<member>
<要素1>検索文字列1</要素1>
<要素2>bbb</要素2>
<要素1>ccc</要素1>
</member>
<member>
<要素1>検索文字列2</要素1>
<要素2>bbb</要素2>
<要素1>ccc</要素1>
</member>
<member>
<要素1>検索文字列3</要素1>
<要素2>bbb</要素2>
<要素1>ccc</要素1>
</member>
<member>
<要素1>検索文字列4</要素1>
<要素2>bbb</要素2>
<要素1>ccc</要素1>
</member>
</チーム>

【実行したい内容】

・検索文字=「検索文字列1」をxmlから検索する。
・検索したxmlの4行目にある、「検索文字列1」と該当したなら、Remove()を使用して削除する。

※検索文字列は、visualstudioのテキストボックスから取得しようと考えております。

試したこと

各技術サイト様を調べて、Xelementやforeachを用いる方法など、複数調べてみましたがどれもうまくいきませんでした。
特に、該当する検索条件を比較する部分に問題があるのでしょうか?

作成中のプログラム例

string FilePath = @"C:\sample.xml";
XElement xdoc = XElement.Load(FilePath);

IEnumerable<string> infos = from item in xdoc.Elements("member")
where item.Element("要素1").Value == "検索文字列1"
select item.Element("要素1").Value;

foreach(XmlElemnt elemnt in infos)
{
//検索文字列の照合… 失敗する部分
//照合が可能であればifを使用して、Removeの処理を行いたい。

}

補足情報(FW/ツールのバージョンなど)

visualstudio2019を使用

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

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

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

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

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

Zuishin

2022/01/11 02:32

member タグがありません。
shosa

2022/01/11 02:53

ご回答ありがとうございます。 どの部分のメンバータグになりますでしょうか?
Zuishin

2022/01/11 02:57

XML の中に <member> が無いという意味です。
shosa

2022/01/11 03:00

すみません。 例として挙げたものでしたので、気が付きませんでした。 すぐに修正いたします。
guest

回答2

0

ベストアンサー

cs

1#nullable disable 2 3using System; 4using System.Linq; 5using System.Xml.Linq; 6 7namespace ConsoleApp1 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 var xml = XDocument.Parse(@"<?xml version=""1.0"" encoding=""utf-8""?> 14<チーム> 15<member> 16<要素1>検索文字列1</要素1> 17<要素2>bbb</要素2> 18<要素1>ccc</要素1> 19</member> 20<member> 21<要素1>検索文字列2</要素1> 22<要素2>bbb</要素2> 23<要素1>ccc</要素1> 24</member> 25<member> 26<要素1>検索文字列3</要素1> 27<要素2>bbb</要素2> 28<要素1>ccc</要素1> 29</member> 30<member> 31<要素1>検索文字列4</要素1> 32<要素2>bbb</要素2> 33<要素1>ccc</要素1> 34</member> 35</チーム>"); 36 37 bool isRemoveTarget(XElement element) => element.Elements("要素1").Any(a => a.Value == "検索文字列1"); 38 foreach (var item in xml.Root.Elements("member").Where(isRemoveTarget)) item.Remove(); 39 Console.WriteLine(xml); 40 } 41 } 42}

上記コードを試してみてください。

isRemoveTarget は XElement 型の引数を判定し、削除対象であれば true を、そうでなければ false を返すローカル関数です。
ローカル関数が使えないバージョンの場合、メソッドとして外に出すかラムダ式を使ってみてください。

次の行で、xml.Root.Elements("member") で member 要素を列挙し、その中から Where(isRemoveTarget) で削除対象を抽出し、それを Remove メソッドで削除しています。

投稿2022/01/11 04:32

編集2022/01/11 04:40
Zuishin

総合スコア28660

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

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

Zuishin

2022/01/11 04:35

質問に書かれている次のコードでうまくいかなかったのは、 > IEnumerable<string> infos = from item in xdoc.Elements("member") Elements が子要素のみを列挙するメソッドであるのに、xdoc の子要素は「チーム」だけであり、「member」が無いからです。 この回答にあるように xdoc.Root.Elements("member") としなければなりません。 また、それ以外にも、文法ミスが多くあります。
Zuishin

2022/01/11 04:42

isRemoveTarget を伝統的な文法で書くと次のようになります。 bool isRemoveTarget(XElement element) { return element.Elements("要素1").Any(a => a.Value == "検索文字列1"); }
shosa

2022/01/11 05:03

ありがとうございます! 文法ミスなどはまだまだ勉強不足の点もあり、気づくことができず申し訳ありません。 しかし、上記のコードを試したところ、想定していた動作になりました!本当に助かりました! 最後に1つだけご質問させてください。 外部にあるxmlファイルを読み込みたいときはどのようにすればよいのでしょうか? XElement xml = XElement.Load("参照するファイルのパス"); この書き方で外部のxmlファイルを開こうとしたところ、XElementにRootの定義が含まれていませんというエラーが発生してしまいました。
Zuishin

2022/01/11 05:17

XDocument.Load です。
shosa

2022/01/11 05:37

ありがとうございます! 無事に実行できました!親切に教えていただきありがとうございます。 勉強不足な点も多くあり、ご迷惑をお掛けいたしましたが、ご厚意本当に感謝しております。 この度は、本当にありがとうございました。
guest

0

以下の記事は参考になりませんか? XML ファイルからデータを取得して Windows Forms アプリの DataGridView に表示し、それをユーザーが編集して結果を XML ファイルに書き戻すサンプルです。

XML ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2019/04/26/show-content-of-xml-file-on-datagridview.aspx


【追記】

「検索条件」に該当する「名前」を持ったxmlデータから[member]を削除する

上に紹介した記事には実装してませんが、「名前」をあいまい検索などで絞って表示し、そこから目的の項目を探して削除することも可能です。一覧を見ないとどれを削除するか決められないのではないかと思いますが、であれば DataGridView に表示してみるのも手だと思います。

投稿2022/01/11 04:08

編集2022/01/11 04:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shosa

2022/01/11 05:08

ご回答ありがとうございます。 非常に参考になる文研でした。こうした方法ではありませんがリストビューなどを使用して表示できればと考えていますので、とても参考になりました。 今回は削除について考えておりましたが、こうした解決方法もあると考えるきっかけにつながりました。ご厚意とても感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問