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 | 属性の値。 |
CDATASection | CDATA セクションの内容。 |
Comment | コメントの内容。 |
Document | null 参照 (Visual Basic では Nothing). |
DocumentFragment | null 参照 (Visual Basic では Nothing). |
DocumentType | null 参照 (Visual Basic では Nothing). |
Element | null 参照 (Visual Basic では Nothing)。XmlElement.InnerText プロパティまたは XmlElement.InnerXml プロパティを使用すると、要素ノードの値にアクセスできます。 |
Entity | null 参照 (Visual Basic では Nothing). |
EntityReference | null 参照 (Visual Basic では Nothing). |
Notation | null 参照 (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