XmlReader.Read()
とXmlReader.ReadStartElement()
の「不一致」を理解しようとしています。以下のreader1
では、すべてが期待されます。つまり、xml全体を読むには3つの読みが必要です。さらに重要なことは、第1回目の読書時、すなわち<firstname>
を読むとき、reader1.Value
は空である。そして第2の読書reader1.Value
はテキストノードの値です。XmlReader.Read()とXmlReader.ReadStartElement()の間の不一致
しかし、私の知る限りではReadStartElement()
は内部Read()
を呼び出し、それが唯一のXmlNodeType
例えばを読む必要があるためreader2
に、私は同じ読み順を期待していますここでは<firstname>
です。 ReadStartElement("firstname")
の代わりに、それが名前firstname
の開始要素であるかどうかと、Read()
を呼び出しているかどうかを確認することができます。 ReadStartElement("firstname")
の直後にreader2.Value
が空でないのはなぜですか? 私はこれを最初に@lesscodeの質問で尋ねました。彼の説明は、msdnによれば、ReadStartElement()
はXmlReader
を次のノードに進め、reader.Value
は現在のノードの値です。もしそうならば、Read()
とReadStartElement()
の間でこれは矛盾していませんか?Read()
を使用すると、後で値を取得しなければならないので、ReadStartElement()
を使用すると、あらかじめValue
を取得する必要があります。
var simpleElement = "<firstname>Jim</firstname>";
using (var reader1 = XmlReader.Create(new StringReader(simpleElement)))
{
var i = 1;
while (reader1.Read())
{
WriteLine($"i = {i++}; value = {reader1.Value}");
}
}
using (var reader2 = XmlReader.Create(new StringReader(simpleElement)))
{
// this internally calls Read() which should have ONLY read the 'firstname' start element node.
reader2.ReadStartElement("firstname");
// prints Jim; but why??? The text node has NOT been read yet!
WriteLine(reader2.Value);
reader2.Read(); //WHY needs this line given text node has been read already?
reader2.ReadEndElement();
}
繰り返しタグを含むxmlのサンプルを投稿します。 – jdweng
@jdweng xmlのサンプルはありません。ジム はXML全体です。私は 'XmlReader()'がどのように動作するかをテストしており、この '問題'を見いだしています。 –
stt106
@JonSkeetどんなアイデアですか? – stt106