我有一个没有太多深度和长度的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();
结果:字符串为空。
调试显示:阅读器为空。它实际上并没有读取字符串。
你们有什么想法吗?
答案 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
}