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

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

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

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

Q&A

解決済

1回答

5619閲覧

XMLファイルを読み込み後、特定のIDの要素を書き換える

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2017/12/21 08:18

編集2017/12/22 01:43

###前提・実現したいこと

<?xml version="1.0" encoding="utf-8" ?> <Extension xmlns=""> <Data Id="1A" Class=""/> <Group Id="BGroup"> <Data Id="1B" Class=""/> <Data Id="2B" Class=""/> <Data Id="3B" Class=""/> <Data Id="4B" Class=""/> </Group> <Group Id="CGroup"> <Data Id="1C" Class=""/> <Data Id="2C" Class=""/> <Data Id="3C" Class=""/> <Data Id="4C" Class=""/> </Group> </Extension>

上記のようなxmlを読込後
Group Id="CGroup"
のData Id="3C"のClassの値を書き換えて保存したいです。
Classだけでなく他の項目がありますが長くなってしまうので省力させてください。

※xmlns=""とか""となっていますがここに書くと長くなったりしていますので省きます。

XmlDocument document = new XmlDocument(); document.Load(FileName); document.SelectSingleNode(@"/Extension/Group[@Id='CGroup']/Data[@Id='3C']")

とやるとNullがかえってきてしまいます。
どこのPathの書き方が間違っているのでしょうか?
正しく取得できる方法と取得後
Classや他の項目の値を変更して保存する方法を教えていただきたいです。

document.GetElementsByTagName("Group")

とやるとグループは取得できたりするのですがそこから3Cを抜き出す方法が不明です。
List内のInnerxmlを見ると

<Data Id=\"3C\"...>

とはなっていますが・・・

///////
追記

var nodeList = document.GetElementsByTagName("Group"); foreach (XmlElement list in nodeList) {   string id = list.Attributes.GetNamedItem("Id").Value.ToString();   if (id == "CGroup")   {    foreach (XmlElement child in list.ChildNodes)    {     string childId = child.Attributes.GetNamedItem("Id").Value.ToString(); if (childId == "3C")     {      child.SetAttribute("Class", ""); }    }   } } document.Save(FileName); コード雑ですみません。

一応こんな感じで書き換えができるようにはなりました。
遠まわしな書き方だと思っているのですが省略できそうなとこなどありますか?

////////////////////////////////////////////////////////////////////////////////////////////////////////

<?xml version="1.0" encoding="utf-8" ?> <Extension xmlns="http://会社のURL/Class.xsd"> <Data Id="1A" Class=""/> <Group Id="CGroup"> <Data Id="1C" Class="1CClass"/> <Data Id="2C" Class="2CClass"/> <Data Id="3C" Class="3CClass"/> <Data Id="4C" Class="4CClass"/> </Group> </Extension>

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

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

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

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

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

Zuishin

2017/12/21 09:17

Plugin はどこにありますか?実際に使っているデータを載せてください。
退会済みユーザー

退会済みユーザー

2017/12/21 10:00

PluginじゃなくてDataです。間違えてました。
guest

回答1

0

ベストアンサー

C#

1var node = document.SelectSingleNode(@"/Extension/Group[@Id='CGroup']/Data[@Id='3C']/@Class"); 2node.Value = "NewClass";

これでできました。

投稿2017/12/21 10:28

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2017/12/22 00:50

回答ありがとうございます。 試してみたのですがNullになってしまいます。 環境は.Net 3.5 visualStudio2015です。 documentのOuterXmlを見てみると <Group Id=\"CGroup\"> <Data Id=\"3C\" Class=\"3CClass\" /> どこもこのようになっているのですが原因のひとつでしょうか?
Zuishin

2017/12/22 00:55

そもそも XML が挙げられたものと違うならうまくいかないと思います。 その途中の \ マークは何でしょうか? OuterXml に出てくるなら明らかに間違っていると思います。 どのようにして XML を読み込んでいますか?
退会済みユーザー

退会済みユーザー

2017/12/22 01:25 編集

XmlDocument document = new XmlDocument(); document.Load(FileName); で読み込んでいます。 読み込んでいるXMLファイルは質問に書いてある形式です。 元のデータの状態は以下のようにしてます。 <Group Id="CGroup"> <Data Id="1C" Class="1CClass"/> <Data Id="2C" Class="2CClass"/> <Data Id="3C" Class="3CClass"/> <Data Id="4C" Class="4CClass"/> </Group> です。
退会済みユーザー

退会済みユーザー

2017/12/22 01:26

FileNameはパスとファイル名がつながったものです。
Zuishin

2017/12/22 01:28

今度は Extension が消えてませんか? 「このくらいわかるだろう」と省略したり変更したりすると問題がどこにあるのかわからなくなります。 質問欄に読み込むファイルの正確な内容を省略せず記載してください。 もちろん手打ちでなくコピペでお願いします。
退会済みユーザー

退会済みユーザー

2017/12/22 01:40

失礼しました。 質問のほうに追記しました
Zuishin

2017/12/22 02:27

追記された XML を input.xml と名付けて実行ファイルと同じディレクトリに置き、次のコードでできることを確認しました。 var document = new XmlDocument(); var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "input.xml"); document.Load(fileName); var names = new XmlNamespaceManager(document.NameTable); names.AddNamespace("xs", "http://会社のURL/Class.xsd"); var attribute = document.SelectSingleNode(@"//xs:Extension/xs:Group[@Id='CGroup']/xs:Data[@Id='3C']/@Class", names); attribute.Value = "NewClass"; Console.WriteLine(document.OuterXml);
Zuishin

2017/12/22 02:28

省略された xmlns が味噌でした。 次回からは省略せずに書かれることをお勧めします。
退会済みユーザー

退会済みユーザー

2017/12/22 02:47

取得できました!!ありがとうございます。 いろいろとお手数をおかけしました。 次回からはそのようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問