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

时间:2016-09-01 08:09:50

标签: c# .net xml string xmlreader

我有一个没有太多深度和长度的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();

结果:字符串为空

使用xmlConfig作为类型字符串的第二个测试:

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

结果:字符串为空。

调试显示:阅读器为空。它实际上并没有读取字符串。

你们有什么想法吗?

2 个答案:

答案 0 :(得分:1)

调用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();

答案 1 :(得分:0)

用一段时间用.Read()

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