前提
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

回答2件
あなたの回答
tips
プレビュー