C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: XMLファイルのノード値の変更について


(過去ログ 22 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■9646 / inTopicNo.1)  XMLファイルのノード値の変更について
  
□投稿者/ あら (35回)-(2007/11/01(Thu) 16:15:59)

分類:[.NET 全般] 

お世話になっております。

XMLのノードの値になにも入れない状態に値を変更したいのですが、どのようにすれ
ばよいでしょうか?

@のように最初に書き込む際はうまくいくのですが、Aのように値を変更した場合
はうまくいきません。変更した場合でも@と同様のようにXMLに記述されるようにし
たいのですが、どうすればよいでしょうか?
Aの場合だと読み込む際に改行+空白が入ってしまって困っています。

@writer.WriteElementString("TEST1", "");
 XMLの記述のされ方:  
 <TEST1 />
 
AnodeList.Item(1).InnerText = "";
 XMLの記述のされ方:
 <TEST2>
  </TEST2>

ご教授、アドバイス等宜しくお願いします。

-----------------
以下簡略したソース

        private void WriteXml_Click(object sender, EventArgs e)
        {
            WriteFile();
        }

        /// <summary>
        /// 書込み
        /// </summary>
        private void WriteFile()
        {
            XmlTextWriter writer = new XmlTextWriter(@"C:\TEST.xml", System.Text.Encoding.GetEncoding("Shift_Jis"));
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 4;

            writer.WriteStartDocument(true);
            writer.WriteStartElement("AAA");
            writer.WriteElementString("TEST1", "");
            writer.WriteElementString("TEST2", "22");
            writer.WriteElementString("TEST3", "33");
            writer.WriteEndElement();
            writer.Close();
        }

        private void ChgXml_Click(object sender, EventArgs e)
        {
            ChangeFile();
        }

        public void ChangeFile()
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.Load(@"c:\TEST.xml");

            XmlElement rootElement = doc.DocumentElement;
            XmlNodeList rootList = rootElement.SelectNodes("/AAA");
            XmlNodeList nodeList = rootList.Item(0).ChildNodes;
            nodeList.Item(1).InnerText = "";

            doc.Save(@"c:\TEST.xml");
        }
        
-----------------
以下作成されたXMLファイル
//変更前
<?xml version="1.0" encoding="shift_jis" standalone="yes"?>
<AAA>
    <TEST1 />
    <TEST2>22</TEST2>
    <TEST3>33</TEST3>
</AAA>

//変更後
<?xml version="1.0" encoding="shift_jis" standalone="yes"?>
<AAA>
  <TEST1 />
  <TEST2>
  </TEST2>
  <TEST3>33</TEST3>
</AAA>

引用返信 編集キー/
■9647 / inTopicNo.2)  Re[1]: XMLファイルのノード値の変更について
□投稿者/ Hongliang (206回)-(2007/11/01(Thu) 16:29:32)
Hongliang さんの Web サイト
2007/11/01(Thu) 16:33:03 編集(投稿者)

PreserveWhitespace かしらん?

<追加>
どっちかというと XmlElement.IsEmpty の方がいいかな?
</追加>
引用返信 編集キー/
■9669 / inTopicNo.3)  Re[2]: XMLファイルのノード値の変更について
□投稿者/ カンタービレ (7回)-(2007/11/01(Thu) 22:36:15)
No9647 (Hongliang さん) に返信
> 2007/11/01(Thu) 16:33:03 編集(投稿者)
>
> PreserveWhitespace かしらん?
>
> <追加>
> どっちかというと XmlElement.IsEmpty の方がいいかな?
> </追加>

xml:space="preserve"の指定で変わるっていうものですね。
VS2002の頃のシリアライズしてるXMLとかは空白無視がデフォルトだったのに
VS2005になったらデフォルトpreserveになってるような気がします。
引用返信 編集キー/
■9683 / inTopicNo.4)  Re[3]: XMLファイルのノード値の変更について
□投稿者/ あら (36回)-(2007/11/02(Fri) 09:51:32)
返信ありがとうございます。

教えて頂いたやり方で
 doc.PreserveWhitespace = true;
として解決しました。

XmlElement.IsEmptyを使用した場合は、設定後再度ノードを書いていくというやり方
になるのでしょうか?

問題自体は解決しましたので、解決済にチェックをしておきます。

ありがとうございました。

解決済み
引用返信 編集キー/
■9684 / inTopicNo.5)  Re[4]: XMLファイルのノード値の変更について
□投稿者/ Hongliang (208回)-(2007/11/02(Fri) 10:15:17)
Hongliang さんの Web サイト
> XmlElement.IsEmptyを使用した場合は、設定後再度ノードを書いていくというやり方
> になるのでしょうか?

SelectNodes や SelectSingleNode では XmlNode 型(およびそのコレクション)が返りますが、その実体はその派生クラスの何かです。
実際にどの型になるかは検索に使用した XPath で異なりますが、要素ノードが引っかかるように書いた XPath では要素ノードを表す型である XmlElement 型が実体になります。
// そこから更に派生してる可能性もありますが、XmlElement にキャストできることは確か。
引用返信 編集キー/
■9686 / inTopicNo.6)  Re[5]: XMLファイルのノード値の変更について
□投稿者/ あら (37回)-(2007/11/02(Fri) 10:29:18)
すばやい返信ありがとうございます。

教えて頂いたやり方で、XmlElement.IsEmptyを用いたやり方でも解決できました。

      //sは任意も文字列
            if (s.Equals(string.Empty))
            {
                ((XmlElement)nodeList.Item(1)).IsEmpty = true;
            }
            else
            {
                nodeList.Item(1).InnerText = s;
            }

ありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -