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

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

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

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

C#

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

Q&A

1回答

7770閲覧

C#でXMLのattributeを置換したいです。

movixy

総合スコア14

XML

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

C#

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

0グッド

1クリップ

投稿2018/08/24 14:44

こんばんは。いつもお世話になっております。

前提・実現したいこと

Visual Studio 2017 Communityを使って開発をしています。
XMLファイルを読み、置換して保存したいです。

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

XMLファイルは、構造的だと思うのですが、うまく該当のNodeとattributeをとりだせずにいます。
取り出す方法と置換方法を教えてください。
試行錯誤のどこが違うのか、添削していただけるとなお助かります。

該当のソースコード

xml

1<?xml version="1.0" encoding="utf-8"?> 2<Users> 3 <PropertyGroup> 4 <UserTarget>Person</UserTarget> 5 </PropertyGroup> 6 <UserGroup> 7 <FamilyName NameString="大山" /> 8 <User Name="ひより" /> 9 <User Name="総司" /> 10 </UserGroup> 11 <UserGroup> 12 <UserItem Name="ベルト" /> 13 </UserGroup> 14</Users>

試したこと

C#

1//現在のxmlを読み込む 2var contents = XElement.Load(xmlpath); 3 4XNamespace nspace = contents.Name.Namespace; 5// ここから試行錯誤。xml-Users-UserGroup-Userを取得したい。 6// 取得してそのattrubuteのNameの値を置換したい。 7var 子孫s = projects.Element(nspace + "ItemGroup").DescendantNodesAndSelf(); 8var Usergroup = projects.Element(nspace + "UserGroup"); 9var UserGroups = projects.Elements(nspace + UserGroup"); 10foreach(var item in UserGroups) { 11 var itemuser = item.Name = "User"; 12 Console.Write(itemuser); 13} 14 15var ItemGroupNones = projects.Elements(nspace + "UserGroup").Elements("User"); 16 17//置換先 18var replaceto = projects.Elements(nspace + "UserGroup") 19 .Where(element => element.ToString().Contains("総司")) 20 .FirstOrDefault(); 21 22replaceto.ReplaceAttributes( 23 new XElement(nspace + "User", 24 new XAttribute("Name", "加賀美") 25 ) 26 ); 27} 28//xmlを保存 29contents.Save(xmlpath);

期待する値

var replaceto = projects.Elements(nspace + "UserGroup") .Where(element => element.ToString().Contains("総司")) .FirstOrDefault();

ここでreplacetoに<User Name="総司" />

### 実際の値

xmlの全文。

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

Visual Studio 2017 community

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

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

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

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

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

guest

回答1

0

XDocumentで読んでXPathで要素を取得するのが簡単です。
単純に値の書き換えならSetAttributeValueで上書きすればOKです。

C#

1var doc = XDocument.Load(xmlpath); 2var el = doc.XPathSelectElement("//Users/UserGroup/User[@Name='総司']"); 3 4el.SetAttributeValue("Name", "加賀美"); 5 6doc.Save(xmlpath);

追記

C#

1foreach (var el in doc.XPathSelectElements("//Users/UserGroup/User")) 2{ 3 var name = el.Attribute("Name").Value; 4 if (name.Contains("総")) 5 { 6 el.SetAttributeValue("Name", "加賀美"); 7 } 8}

追記その2

C#

1var el = doc.XPathSelectElements("//Users/UserGroup/User") 2 .FirstOrDefault(e => e.Attribute("Name").Value.Contains("総"));

投稿2018/08/25 02:46

編集2018/08/26 17:03
toki_td

総合スコア2850

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

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

movixy

2018/08/25 09:11

ありがとうございます。 "総司"のところは実データはもう少し大量で複雑なので、string操作(ContainsやStartWithやRegex)して条件分岐したいです。 @Name='総*'のような書き方はたぶんできないと思います。 なので配列みたいに取得したいです。
toki_td

2018/08/26 17:00

追記しました。 XPathSelectElementsでUserを列挙できるので、foreachなりLINQなりでフィルタすればいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問