【发布时间】:2013-08-17 20:58:42
【问题描述】:
我遇到了 XmlReader.ReadInnerXmlAsync() 方法的奇怪行为。虽然以下代码有效...
using (XmlReader r = XmlReader.Create(stream, new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType) {
case XmlNodeType.Element:
if (r.Name.Equals("c"))
{
string x = await r.ReadInnerXmlAsync();
OnReceive("[ " + x + " ]");
}
break;
}
}
}
...并且来自以下 XML 的整个元素 <c></c> 被读取为字符串。
<?xml version='1.0' encoding='UTF-8'?>
<namespace:open>
<namespace:a>
<b></b>
<c>
<d>TEXT01</d>
<d>TEXT01</d>
<d>TEXT01</d>
<d>TEXT01</d>
</c>
<e>
<f>TEST01</f>
</e>
<g/>
<h/>
</namespace:a>
...
我无法使用相同的代码 (r.Name.Equals("namespace:a")) 读取 <namespace:a>。为什么?代码只是在字符串x = await r.ReadInnerXmlAsync(); 处阻塞,我确信数据会在几秒钟内到达。
是不是因为“如果reader位于叶子节点,调用ReadInnerXml就相当于调用Read”。 (在发送更多数据之前会阻塞)在http://msdn.microsoft.com/de-de/library/system.xml.xmlreader.readinnerxml.aspx 中记录?我该如何解决这个问题?
如何在无需等待更多 XML 数据的情况下读取内部或外部 XML?
更新:
我找到了一个解决方案。
XmlDocument doc = new XmlDocument();
doc.Load(r.ReadSubtree());
doc.DocumentElement.OuterXml;
也许有人会提供更优雅的东西。
【问题讨论】:
-
你怎么称呼这段代码?你用
Wait()还是Result? -
您缺少命名空间声明。
标签: c# xml-parsing async-await c#-5.0