分類:[.NET 全般]
2016/02/15(Mon) 17:59:36 編集(投稿者)
Win7 32/64bit Vs2015 C# .Net3.5〜
お世話になります。Xmlファイルに対して以下のような編集を実現したいです。
-<編集前>----------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<Framework>
<DebugMode Value="false" />
<Path Value="C:\test" />
</Framework>
</configuration>
-<編集後>----------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<Framework>
<DebugMode Value="false" />
<DebugMode2 Value="false" /> ←挿入
<DebugMode3 Value="false" /> ←挿入
<Path Value="C:\test" />
</Framework>
</configuration>
※DeBugModeとPathの間にDebug2、Debug3を挿入する。
読み込んだ編集前のXmlデータはツリービュー上でツリー構造
で表示しています。また、TreeNodeのTagにXmlNodeを紐付けて
ツリーノード選択時に対応するXmlNodeを取得できるようにし
ています。
挿入したいXml要素は画面上のテキストボックス上に直接Xml形式で
入力します。
-<挿入対象:テキストボックスに記載>----------------
<DebugMode2 Value="false" />
<DebugMode3 Value="false" />
---------------------------------------------------
以下、コード
-<Xml初期読み込み>---------------------------------
XmlDocument m_xmlDocument;
m_xmlDocument.Load(xmlFile);
-<要素挿入処理:Button_Click>----------------------
//○追加対象をドキュメントオブジェクトに作成
XmlDocument xdocNew = new XmlDocument();
xdocNew.InnerXml = "<Root>\n" + rtText.Text + "\n" + "</Root>";
XmlNode xnAddNewRoot = xdocNew.FirstChild;
//○参照ノード取得(追加位置)
XmlNode refNode = (XmlNode)tvXml.SelectedNode.Tag;
//○全要素をループ処理
for (int i = xnAddNewRoot.ChildNodes.Count-1; i>=0; i--)
{
XmlNode xnNewNode = xnAddNewRoot.ChildNodes[i];
//追加対象をXmlElementとして作成
XmlElement xmlNewElement = m_xmlDocument.CreateElement(xnNewNode.Name);
xmlNewElement.InnerXml = xnNewNode.InnerXml;
try
{
XmlNode AddedNode = m_xmlDocument.DocumentElement.InsertBefore(xmlNewElement, refNode);
refNode = AddedNode; //参照ノードを更新
}
catch (Exception err)
{
MessageBox.Show(err.Message.ToString());
}
xnNewNode = xdocNew.NextSibling;
}
---------------------------------------------------------
上記のコードを元に
<DebugMode2 Value="false" />
<DebugMode3 Value="false" />
の挿入を試したところ
@「<Framework>」を選択して挿入した場合
「<Framework>」の前に挿入できた。
※但し、上記コードではValueはまだ取り込んでません。
A「<Path Value="C:\test" />」を選択して挿入した場合
catchブロックにて「参照ノードはこのノードの子ではありません。」
のエラーが表示される。
上記のようになります。
Aのエラーをどのようにすれば回避して、意図した編集ができるでしょうか。
以上、よろしくお願いします m(__)m。