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

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

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

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

C#

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

Q&A

解決済

2回答

4322閲覧

XML形式ファイルの部分書き換え

JanTh1989

総合スコア87

XML

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

C#

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

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

0グッド

0クリップ

投稿2019/04/07 18:54

編集2019/04/07 22:47

前提

C#にて、以下のような動きのフォームアプリ+ライブラリ(DLL)を検討中です。
①ファイルパスをユーザが任意に指定
②ライブラリ(DLL)実行
③XML形式ファイルを読み込み(XDocument.Load())
④読み込みデータから一部抽出して規定の構造に変換(XDocumentクラス)
⇒XPathによるデータ抽出+ループで構築
⑤変換した構造のデータを表示(TreeView表示)
⑥表示しているデータをユーザ任意に編集
⑦ライブラリ(DLL)実行
⑧編集後データを元のXMLファイルに反映
フォームアプリで①②⑤⑥⑦。
ライブラリ(DLL)が③④⑧。
●ライブラリのインターフェース

C#

1// ②のファイル読み込み、変換のインターフェース関数 2public long LoadFile(string filePath, out XDocument loadData,); 3// ⑦のファイル更新のインターフェース関数 4public long UpdataFile(string filePath, XDocument data); 5 6// ※戻り値long型は、ファイルが無いなどのエラーコードを返します。

例)
●元XMLファイル

XML

1<?xml version="1.0" encoding="Shift_JIS"?> 2<root> 3 <Sales Name="sales"> 4 <SalseMember Name="saleseMember1"> 5 <Name>Tanaka</Name> 6 <Age>40</Age> 7 <Career>15</Career> 8 </SalseMember> 9 <SalseMember Name="saleseMember2"> 10 <Name>Suzuki</Name> 11 <Age>28</Age> 12 <Career>3</Career> 13 </SalseMember> 14 </Sales> 15 <Engineer Name="engineer"> 16 <EngineerMember Name="engineerMember1"> 17 <Name>Yamada</Name> 18 <Age>45</Age> 19 <Career>20</Career> 20 <History>History001</History> 21 </EngineerMember> 22 <EngineerMember Name="engineerMember2"> 23 <Name>Sakamoto</Name> 24 <Age>30</Age> 25 <Career>5</Career> 26 <History>History002</History> 27 </EngineerMember> 28 </Engineer> 29 <TechnologyHistory> 30 <History Name="History001"> 31 <Language Name="C言語"> 32 <Career>10</Career> 33 </Language> 34 <Language Name="Java"> 35 <Career>10</Career> 36 </Language> 37 </History> 38 <History Name="History002"> 39 <Language Name="C++"> 40 <Career>5</Career> 41 </Language> 42 </History> 43 </TechnologyHistory> 44</root>

●変換後データ
①EngineerMemberタグ抽出で一覧作り
②EngineerMemberタグのHistoryタグ値に紐づくTechnologyHistoryタグデータを抽出して①の子要素に反映
など

XML

1<?xml version="1.0" encoding="Shift_JIS"?> 2<root> 3 <engineer> 4 <engineerMember1> 5 <Name>Yamada</Name> 6 <Age>45</Age> 7 <Career>20</Career> 8 <History Name="001"> 9 <Language Name="C言語"> 10 <Career>10</Career> 11 </Language> 12 <Language Name="Java"> 13 <Career>10</Career> 14 </Language> 15 </History> 16 </engineerMember1> 17 <engineerMember2> 18 <Name>Sakamoto</Name> 19 <Age>30</Age> 20 <Career>5</Career> 21 <History Name="002"> 22 <Language Name="C++"> 23 <Career>5</Career> 24 </Language> 25 </History> 26 </engineerMember2> 27 </engineer> 28</root>

●表示(TreeView構成)
<構成>
変換後データのタグ名でツリー構成
<機能>
・TreeViewの項目選択でタグ名+値持ちタグ名項目なら値をテキストボックス表示
・テキストボックスの値変更で変換済データを変更
※ツリー項目追加はありません

TreeView

1engineerMember1 2 ├Name 3 ├Age 4 ├Career 5 └History 6 ├C言語 7 └Java 8engineerMember2 9 ├Name 10 ├Age 11 ├Career 12 └History 13 └C++

問題点

「⑧編集後データを元のXMLファイルに反映」の処理が以下の観点で行き詰まっています。
・編集後データはSalesタグの情報は全く持っていない。
・元ファイル読み込みデータ(XDocument)は変換後に一旦破棄。
・変換が単純なタグデータ抽出ではなく、属性値をタグ名化したり、タグ値に該当する別ブロックデータを合体させたりと、構造が全然違う。
・タグ値だけでなく、TreeView項目(属性値のタグ名化のものも含む)も変更可。

ハッシュテーブルで・・・という案がチラッと挙がったのですが、私はハッシュなるものがあまり詳しくなく・・・。

何か良い方法があれば、案をお教え頂ければと思います。
また、元ファイルの読み込みデータ(XDocumentクラス)の変換後破棄をやめれば、別案が可能などもあれば、そちらについても検討します。

どうかよろしくお願い致します。

補足

開発言語:C#
開発環境:VisualStudio2015 Professional
.NET:バージョン4.6

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

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

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

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

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

Zuishin

2019/04/08 02:20

変換後の XML って必要ですか? 変換で情報が欠落しているので元に戻せないんじゃないですか?
guest

回答2

0

自己解決

ひとまずデータ変換時に更新対象の項目のXPathのハッシュテーブルを生成して、
ファイル更新時に「対象のXElemen抽出⇒更新」を繰り返し行って対応することとしました。

投稿2019/04/09 02:17

JanTh1989

総合スコア87

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

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

0

なにを問題にしてるのかよーわかりませんが、、

ファイルの書き換え、というのは無理なので、

・ファイルを読み込み
・データ変換
・新たにファイルを書き込み直し

ということになるかとおもいます

#万全を期すなら元ファイルはバックアップファイルとしてリネームしておく

投稿2019/04/07 22:38

y_waiwai

総合スコア87774

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

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

JanTh1989

2019/04/09 02:16

回答ありがとうございます。 やはりファイル書き換えを各所で、というのは無理ですよね・・・。
y_waiwai

2019/04/09 02:27

ファイルのデータは場所が決まってると考えてください #原稿用紙に文字書いてると考えるとわかりやすいかも 10文字を新たな10文字に書き換えるというのは可能ですが、それを20文字にする、とか、8文字にするとかは無理になります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問