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

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

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

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

C#

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

Q&A

解決済

1回答

3088閲覧

[C#]XMLファイルに追加した要素の不要な属性を削除したい

Arisa.Sunagawa

総合スコア15

XML

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

C#

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

0グッド

0クリップ

投稿2018/12/02 10:10

前提・実現したいこと

XML1を読み込み、XML2を出力するC#のプログラムを作成したい。

発生している問題・エラーメッセージ

3つ目のXMLファイルのように、追加した要素に不要な名前空間の属性がある。

該当のソースコード

C#

1private void button_Click(object sender, EventArgs e) 2{ 3 // XMLの読み込み 4 XmlDocument doc = new XmlDocument(); 5 doc.Load("sample.xml"); 6 7 // XMLの子要素作成 8 XmlElement xmlEvent = doc.CreateElement("event"); 9 xmlEvent.InnerText = ""; 10 XmlAttribute xmlAtr = doc.CreateAttribute("Symbol"); 11 xmlAtr.Value = "TestSymbol"; 12 xmlEvent.SetAttributeNode(xmlAtr); 13 14 // XMLの属性削除 15 xmlEvent.RemoveAttribute("xmlns"); //xmlnsは削除されなかった。 16 //xmlEvent.RemoveAttributeAt(0); //追加したSymbolが削除。0ではなく1を指定した所何も削除されなかった。 17 //xmlEvent.RemoveAllAttributes(); //追加したSymbolが削除され、xmlnsは削除されなかった。 18 19 // XMLの孫要素作成 20 XmlElement xmlTitle = doc.CreateElement("title"); 21 xmlTitle.InnerText = "TestAdd"; 22 xmlEvent.AppendChild(xmlTitle); 23 24 // 作成した要素の挿入、保存 25 XmlNodeList x = doc.GetElementsByTagName("eventTest"); 26 XmlNode node = x[0]; 27 node.AppendChild(xmlEvent); 28 doc.Save("test2.xml"); 29}

XML1

1<?xml version = "1.0" encoding = "utf-8"?> 2<Test:test1 xmlns="http://www.test.co.jp/1" xmlns:Test="http://www.test.co.jp/2"> 3 <eventTest> 4 <event Symbol="Test1"> 5 <title>START</title> 6 <type>Immediate</type> 7 </event> 8 </eventTest> 9</Test:test1>

XML2

1<?xml version="1.0" encoding="utf-8"?> 2<Test:test1 xmlns="http://www.test.co.jp/1" xmlns:Test="http://www.test.co.jp/2"> 3 <eventTest> 4 <event Symbol="Test1"> 5 <title>START</title> 6 <type>Immediate</type> 7 </event> 8 <event Symbol="TestSymbol"> 9 <title>TestAdd</title> 10 </event> 11 </eventTest> 12</Test:test1>

XML3

1<?xml version="1.0" encoding="utf-8"?> 2<Test:test1 xmlns="http://www.test.co.jp/1" xmlns:Test="http://www.test.co.jp/2"> 3 <eventTest> 4 <event Symbol="Test1"> 5 <title>START</title> 6 <type>Immediate</type> 7 </event> 8 <event Symbol="TestSymbol" xmlns=""> 9 <title>TestAdd</title> 10 </event> 11 </eventTest> 12</Test:test1>

試したこと

1.以下のコードを実行した。
// XMLの属性削除
xmlEvent.RemoveAttribute("xmlns"); //xmlnsは削除されなかった。
xmlEvent.RemoveAttributeAt(0); //追加したSymbolが削除。0ではなく1を指定した所何も削除されなかった。
xmlEvent.RemoveAllAttributes(); //追加したSymbolが削除され、xmlnsは削除されなかった。

2.以下のXMLファイルの親要素名を変更した。
<Test:test1 xmlns="http://www.test.co.jp/1" xmlns:Test="http://www.test.co.jp/2"></Test:test1>
<test1></test1>
こう変更したところ、不要な属性は追加されなくなった。
ただし、この行は別の理由で必要な為、削除することはできない。

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

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

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

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

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

Arisa.Sunagawa

2018/12/02 10:41 編集

誤って作成中の下書きを新規投稿してしまいました。 旧いスレッドは削除依頼をだしています。 taratail使うの初めてなため、変なことをして申し訳ありません。
Zuishin

2018/12/04 00:25

削除依頼が出ていないようです。重複であることを明記してもう一度削除依頼してください。
guest

回答1

0

ベストアンサー

名前空間を一致させれば出なくなります。

C#

1 var x = doc.GetElementsByTagName("eventTest"); 2 var node = x[0]; 3 4 // XMLの子要素作成 5 var xmlEvent = doc.CreateElement("event", node.NamespaceURI); 6 7 // ...中略... 8 9 // XMLの孫要素作成 10 var xmlTitle = doc.CreateElement("title", node.NamespaceURI);

ちなみに、XmlDocument よりも XDocument のほうが扱いが楽だと思うのでこちらも考慮してみてください。

投稿2018/12/03 02:47

x_x

総合スコア13749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問