XmlReader没有任何内容——是的,我调用了read()等等

本文关键字:调用 read 等等 任何内 是的 XmlReader | 更新日期: 2023-09-27 18:05:19

我有一个没有太多深度和长度的xml。它包含大约20个键值对。现在我想读取一个特定的值。容易吗?好吧,如果XmlReader突然不想再这样做了:

输入:

<?xml version="1.0" encoding="utf-8" ?>
<CATALOG>
  <CD>
    <TITLE>My test Title</TITLE>
  </CD>
</CATALOG>

第一个测试使用xmlConfig作为xml类型字符串:

var reader = XmlReader.Create(new StringReader(xmlConfig));
reader.Read();
string theXmlString = reader.ReadOuterXml();

Result: String is empty

第二个测试,xmlConfig作为xml类型字符串:

var reader = XmlReader.Create(new StringReader(xmlConfig));
reader.MoveToAttribute("myAttr");
string theXmlString = reader.ReadInnerXml();

Result: String is empty.

调试显示:reader为空。它实际上并不读取字符串。

你们有什么想法吗?

XmlReader没有任何内容——是的,我调用了read()等等

调用reader.Read将移动到下一个节点。所以当你第一次调用它时,它移动到你的声明<?xml version...。如果您再次调用它,它将移动到空白处。如果你再次调用它,它将移动到CATALOG,以此类推。

因此,考虑到这一点,这将使您获得整个CATALOG元素作为字符串:

reader.Read(); // moves to XML declaration
reader.Read(); // moves to whitespace (new line)
reader.Read(); // moves to CATALOG element
string xml = reader.ReadOuterXml(); // reads all of catalog element

正如建议的那样,您通常会在循环中执行此操作:

while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element)
    {
        // do something
    }
}

尽管如此,我强烈建议您不要这样阅读XML,除非您有很好的理由。我建议您使用LINQ to XML,它是一个高级API,为您处理低级细节。例如,要获取TITLE元素的值:

var doc = XDocument.Parse(xml);
var title = (string)doc.Descendants("TITLE").Single();

在.Read()中使用while

 while (reader.Read())
 {
       // magic
 }