0

メソッドの奇妙な動作に遭遇しました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;

多分誰かがもっとエレガントなものを提供するでしょう。

4

1 に答える 1

0

私は1つの解決策を見つけました。

XmlDocument doc = new XmlDocument();
doc.Load(r.ReadSubtree());
doc.DocumentElement.OuterXml;

多分誰かがもっとエレガントなものを提供するでしょう。

于 2013-08-17T12:58:42.443 に答える