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为空。它实际上并不读取字符串。
你们有什么想法吗?
调用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
}