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。

原文地址:https://www.cnblogs.com/worldreason/p/1256290.html