XmlElementのValueプロパティに値を代入できない / ノード型 'Element' では、値を設定できません。エラーが発生する - C#

XmlElementのValueプロパティに値を代入できない現象について紹介します。

概要

下記コードを実行すると、System.InvalidOperationException 例外が発生します。
また、下記のエラーメッセージが表示されます。
エラーメッセージ
ノード型 'Element' では、値を設定できません。
XmlElement型のValueプロパティには値を代入できない旨のメッセージが表示されます。

コード

private void button7_Click(object sender, EventArgs e)
{
  XmlDocument xmlDocument = new XmlDocument();

  XmlElement elem = xmlDocument.CreateElement("root");
  xmlDocument.AppendChild(elem);

  XmlElement item_elem = xmlDocument.CreateElement("item");
  elem.AppendChild(item_elem);
  elem.Value = "Penguin";

  xmlDocument.Save(textBox3.Text);

  textBox4.Text += "Write Complete!";
}

解説

XmlElemntはNodyTypeがElement型であるため、下記のNodeType型に対応するValue値の表を参照するとValue値はnull参照であることがわかります。このため、Value値に値を代入することができません。対策として下表にも記載してある通り、InnerTextプロパティやInnerXmlプロパティを用いることで要素ノードの値にアクセスできます。

NodeType型によるValue値


Attribute属性の値。
CDATASectionCDATA セクションの内容。
Commentコメントの内容。
Documentnull 参照 (Visual Basic では Nothing).
DocumentFragmentnull 参照 (Visual Basic では Nothing).
DocumentTypenull 参照 (Visual Basic では Nothing).
Elementnull 参照 (Visual Basic では Nothing)。XmlElement.InnerText プロパティまたは XmlElement.InnerXml プロパティを使用すると、要素ノードの値にアクセスできます。
Entitynull 参照 (Visual Basic では Nothing).
EntityReferencenull 参照 (Visual Basic では Nothing).
Notationnull 参照 (Visual Basic では Nothing).
ProcessingInstructionターゲットを含まない全体の内容。
Textテキスト ノードの内容。
SignificantWhitespace空白文字。空白は、1 つ以上の空白文字、キャリッジ リターン、ライン フィード、またはタブによって構成できます。
Whitespace空白文字。空白は、1 つ以上の空白文字、キャリッジ リターン、ライン フィード、またはタブによって構成できます。
XmlDeclaration宣言の内容。つまり <xml と ?> の間のすべて。

対策

下記のコードに変更することで対策できます。

コード

private void button8_Click(object sender, EventArgs e)
{
  XmlDocument xmlDocument = new XmlDocument();

  XmlElement elem = xmlDocument.CreateElement("root");
  xmlDocument.AppendChild(elem);

  XmlElement item_elem = xmlDocument.CreateElement("item");
  elem.AppendChild(item_elem);

  XmlNode node = xmlDocument.CreateNode(XmlNodeType.Text, "", "");
  node.Value = "Penguin";
  item_elem.AppendChild(node);
  
  xmlDocument.Save(textBox3.Text);

  textBox4.Text += "Write Complete!";
}

解説

上記のコード例のようにXmlNodeクラスのインスタンスを作成し、NodeTypeをXmlNodeType.TextにすることでValueプロパティに代入が可能になります。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用

関連するページ

最終更新日: 2021-08-24
作成日: 2011-01-12
iPentec all rights reserverd.