XmlTextReader需要注意的问题
对于xml:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Pkboy kind="site">
<command name="price" object="game" password="asdfasdf">
<game name="魔兽世界">
<server name="魔兽服务器一号">
<item name="金币" kind="gold" quantity="12" gross="0.5005" maxdollar="99" mindollar="88" rate="6.88" />
</server>
</game>
</command>
</Pkboy>
使用XmlTextReader进行读取:
byte[] buffer = Encoding.UTF8.GetBytes(xml);
using (stream = new MemoryStream(buffer))
{
using (XmlTextReader str = new XmlTextReader(stream))
{
str.Read();
str.Read();
str.Read();
Assert.AreEqual("Pkboy", str.Name);
str.Read();
str.Read();
Assert.AreEqual("command", str.Name);
str.Read();
str.Read();
Assert.AreEqual("game", str.Name);
str.MoveToFirstAttribute();
Assert.AreEqual("魔兽世界", str.Value);
str.Read();
str.Read();
str.MoveToFirstAttribute();
Assert.AreEqual("魔兽服务器一号", str.Value);
}
}
上面的测试是正常的,也就是说3次Read()以后到了Pkboy节点。为什么呢?
经过追踪,第一次Read()以后,到了
<?xml version="1.0" encoding="utf-8" standalone="yes"?>,显示节点的名称是xml,也就是把<>内的东西当成
一个节点。 而version等都是属性,要是取这些属性,必须用MoveToFirstAttribute类似的一组方法。这里不取,再次Read(),
然后就到了文档的"\r\n",也就是第二个Read()包含的东西是"\r\n",如果存在回车换行,那么就会被当成一个节点Read()一次。
如果不包含"\r\n",那么就直接可以到达下一个节点。
所以,这里因为包含了回车换行,所以,3次以后到达第一个元素Pkboy。