XmlElementのValueプロパティに値を代入できない現象について紹介します。
下記コードを実行すると、System.InvalidOperationException
例外が発生します。
また、下記のエラーメッセージが表示されます。
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プロパティを用いることで要素ノードの値にアクセスできます。
型 | 値 |
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プロパティに代入が可能になります。