メソッドの奇妙な動作に遭遇しました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;
}
}
}
<c></c>
...そして、次の XML の要素全体が文字列として読み取られます。
<?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>
...
<namespace:a>
同じコード ( )では読めませんr.Name.Equals("namespace:a")
。なんで?コードは文字列でブロックするだけx = await r.ReadInnerXmlAsync();
で、データが数秒で到着することが確実にわかります。
「リーダーがリーフノードに位置する場合、ReadInnerXml を呼び出すことは、Read を呼び出すことと同じ」という事実のためでしょうか。(より多くのデータが送信されるまでブロックします) http://msdn.microsoft.com/de-de/library/system.xml.xmlreader.readinnerxml.aspxに記載されています。どうすればこれを回避できますか?
次の XML データを待たずに内部または外部 XML を読み取るにはどうすればよいですか?
アップデート:
私は1つの解決策を見つけました。
XmlDocument doc = new XmlDocument();
doc.Load(r.ReadSubtree());
doc.DocumentElement.OuterXml;
多分誰かがもっとエレガントなものを提供するでしょう。