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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Q&A

解決済

3回答

10880閲覧

XML 指定要素の削除

Qoo

総合スコア1249

C#

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

0グッド

1クリップ

投稿2019/04/26 07:26

下記のようなXMLでアイテムNOが002のもの(Category1、Name含めて)を削除したいのですが、
どのような記述になるのでしょうか

下記のサイトを参考にして考えているのですが
Noをどのように指定すればよいかわかりません

http://hiros-dot.net/CS2005/XML/DOM/DOM18.htm

<?xml version="1.0" encoding="UTF-8"?> <Data> <Item No="0001">   <Category1>野菜</Category1> <Name>トマト</Name> </Item> <Item No="0002">   <Category1>野菜</Category1> <Name>キャベツ</Name> </Item> <Item No="0003">   <Category1>フルーツ</Category1> <Name>スイカ</Name> </Item> </Data>

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

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

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

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

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

guest

回答3

0

ベストアンサー

No は属性(Attribute)です。

なので、XmlElement.Attributes プロパティで属性のコレクションを取得し、その中から "No" を探し、その Value が "0002" の XmlElement を削除するということになるはずです。

質問者さんが参考にしている記事のコードをできるだけ使って書くと以下のようになるはずです。

XmlDocument xdoc = new XmlDocument(); string file = @"ファイルパス"; xdoc.Load(file); XmlElement root = xdoc.DocumentElement; XmlNodeList nodes = root.GetElementsByTagName("Item"); foreach (XmlElement element in nodes) { if (element.Attributes["No"].Value == "0002") { root.RemoveChild(element); break; } }

お試しください。

投稿2019/04/26 09:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Qoo

2019/04/26 09:54

大変分かり易く説明頂きありがとうございます! 無事解決し、理解も深める事ができました。
guest

0

https://docs.microsoft.com/ja-jp/dotnet/api/system.xml.linq.xdocument?view=netframework-4.8
XDocumentが使えるのであれば、こちらでどうでしょうか。

var xdoc = XDocument.Load(@"d:\Test.xml"); var datas = xdoc.Element("Data"); var item0002 = datas.Elements("Item") .Where(x => x.Attribute("No").Value == "0002") .ToList(); foreach (var node in item0002) { node.Remove(); } xdoc.Save(@"d:\Test2.xml");

投稿2019/04/26 08:15

編集2019/04/26 08:56
510vivienne

総合スコア40

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

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

Qoo

2019/04/26 09:56

回答ありがとうございます! まだ、XDocumentとXML Documentの違いがよくわかっていないのでもう少し理解を深めてチャレンジしてみたいと思います
guest

0

参考にされたサイトとは別アプローチですが、XPathを使用してノードを指定する方法もあります。
属性値が"0002"のItemエレメントを表すルートからのXPathは/Data/Item[@No="0002"]となります。
XPathは複雑な検索パスを簡潔に記述できるので覚えておいて損はないです。

以下はXmlDocumentを使用するパターンと、XDocumentを使用するパターンです。

C#

1/* XmlDocument版 */ 2using System.Xml; 3 4var file = @"ファイルパス"; 5var xpath = @"/Data/Item[@No=""0002""]"; 6var doc = new XmlDocument(); 7doc.Load( file ); 8 9var items = doc.SelectNodes( xpath ); 10foreach( var item in items ) { 11 item.ParentNode.RemoveChild( item ); 12}

C#

1/* XDocument版 */ 2using System.Xml.Linq; 3using System.Xml.XPath; 4 5var file = @"ファイルパス"; 6var xpath = @"/Data/Item[@No=""0002""]"; 7var doc = XDocument.Load( file ); 8var items = doc.XPathSelectElements( xpath ); 9foreach( var item in items ) { 10 item.Remove(); 11}

投稿2019/04/26 14:58

draq

総合スコア2573

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問