- PR -

Xmlのルート要素を追加について

1
投稿者投稿内容
なぎさ
会議室デビュー日: 2007/11/15
投稿数: 10
投稿日時: 2008-01-20 21:04
Xmlのルート要素追加についての質問です。
例のようなXmlがあるのですが、
【例】
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Info>
<ID>001</ID>
<Name>name1</Name>
<Age>23</Age>
</Info>
</Test>

<Info>
</Info>
を追加するところで躓いてしまいました。

処理内容として
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("読み込むXmlファイルパス");
XmlNode nodeRoot = xmlDoc.SelectSingleNode("/Test");
XmlElement elementNode = xmlDoc.CreateElement("Info");
nodeRoot.AppendChild(elementNode);
xmlDoc.Save("保存するXmlファイルパス");
と書いたのですが、保存されたXmlファイルは
<Test>
<Info>
<ID>001</ID>
<Name>name1</Name>
<Age>23</Age>
</Info>
<Info />
<ID>002</ID>
<Name>name2</Name>
<Age>24</Age>
</Test>
となってしまい、<Info>の終了タグを</Test>の前に追加するにはどのようにしたらよろしいのでしょうか?

開発言語はVisualStudio2005のC#です。
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2008-01-20 23:14
VisualStudio2005もC#も使用したことがありませんので確かではありませんが
処理内容をかなり省略してませんか?
<ID>002</ID>
<Name>name2</Name>
<Age>24</Age>
の部分をnodeRootにappendするコードが書いてあるように思えます。
elementNodeに上記要素を追加するようにしてみてください。
なぎさ
会議室デビュー日: 2007/11/15
投稿数: 10
投稿日時: 2008-01-20 23:57
処理内容を省略してしまい、大変失礼いたしました。
具体的な処理内容は以下の通りです。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("読み込むXmlファイルパス");
XmlNode nodeRoot = xmlDoc.SelectSingleNode("/Test");
XmlElement elementNode = xmlDoc.CreateElement("Info");
nodeRoot.AppendChild(elementNode);

elementNode = xmlDoc.CreateElement("ID");
elementNode.AppendChild(xmlDoc.CreateTextNode(textBox1.Text));
xmlDoc.DocumentElement.AppendChild(elementNode);

elementNode = xmlDoc.CreateElement("Name");
elementNode.AppendChild(xmlDoc.CreateTextNode(textBox2.Text));
xmlDoc.DocumentElement.AppendChild(elementNode);

elementNode = xmlDoc.CreateElement("Age");
elementNode.AppendChild(xmlDoc.CreateTextNode(textBox3.Text));
xmlDoc.DocumentElement.AppendChild(elementNode);

xmlDoc.Save("保存するXmlファイルパス");

このように書くと保存されたXmlファイルが以下のようになってしまいました。

<Test>
<Info>
<ID>001</ID>
<Name>name1</Name>
<Age>23</Age>
</Info>
<Info />
<ID>002</ID>
<Name>name2</Name>
<Age>24</Age>
</Test>

因みに
<Info>
<ID>001</ID>
<Name>name1</Name>
<Age>23</Age>
</Info>
は初期値として書いていたものです。
なぎさ。
会議室デビュー日: 2007/12/21
投稿数: 9
お住まい・勤務地: カンサイ
投稿日時: 2008-01-21 09:39
elementNodeが途中で上書きされて
作成したInfoオブジェクトへアクセスできないようになってしまっています

xmlDoc.DocumentElementは/Testを取得しますので
そこへ追加しているので
<Test>の小として扱われてしまっています

elementNodeにInfoノードオブジェクトが入っているので
そこにID等小として追加することで行えます

コード:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"test.xml");
// Test取得
XmlNode nodeRoot = xmlDoc.SelectSingleNode("/Test");
// XmlNode nodeRoot = xmlDoc.DocumentElement;
// これでも代用可能

// Infoノード作成
XmlElement elementNode = xmlDoc.CreateElement("Info");
// Infoノード/Testに追加
nodeRoot.AppendChild(elementNode);

// 子共通利用
XmlElement elementChild;

// 子生成
elementChild = xmlDoc.CreateElement("ID");
// 子Text生成
elementChild.AppendChild(xmlDoc.CreateTextNode(textBox1.Text));
// Info追加
elementNode.AppendChild(elementChild);

// 以下同じ
elementChild = xmlDoc.CreateElement("Name");
elementChild.AppendChild(xmlDoc.CreateTextNode(textBox2.Text));
elementNode.AppendChild(elementChild);

elementChild = xmlDoc.CreateElement("Age");
elementChild.AppendChild(xmlDoc.CreateTextNode(textBox3.Text));
elementNode.AppendChild(elementChild);
// 保存
xmlDoc.Save(@"out.xml"); 



XMLファイル
コード:
test.xml
<?xml version="1.0" encoding="utf-8"?>
<Test>
  <Info>
    <ID>001</ID>
    <Name>name1</Name>
    <Age>23</Age>
  </Info>
</Test>


out.xml
<?xml version="1.0" encoding="utf-8"?>
<Test>
  <Info>
    <ID>001</ID>
    <Name>name1</Name>
    <Age>23</Age>
  </Info>
  <Info>
    <ID>002</ID>
    <Name>name2</Name>
    <Age>24</Age>
  </Info>
</Test>

なぎさ
会議室デビュー日: 2007/11/15
投稿数: 10
投稿日時: 2008-01-23 23:18
回答ありがとうございます。
コーディングしたところ、無事にルートを追加することが出来ました。
1

スキルアップ/キャリアアップ(JOB@IT)