1

这会挂起应用程序:

XPathDocument xPathDocument = new XPathDocument(networkStream);

我认为这是由于 XPathDocument 仍在等待数据,但如何防止呢?

4

1 回答 1

2

由于服务器在发送整个 XML 后没有关闭连接(连接保持打开以供将来通信)XPathDocument 仍在等待数据。服务器不提供任何其他数据来确定 XML 传输是否完成。但是,可以检查根标记结尾是否接收到整个 XML。XPathDocument 不寻找根标签结尾,所以这个解决方案有点棘手,但有效。我使用 XmlReader 读取流并通过在 StringWriter 中写入的 XmlWriter 再现 XML。最后,StringWriter 的字符串输出被提供给 StringReader,由 XmlReader 读取。最后,XPathDocument 从这个 XmlReader 中读取数据。这是示例代码:

        XmlReader xmlReader = XmlReader.Create(networkStream);
        StringWriter stringWriter = new StringWriter();
        XmlWriter xmlReadBuffer = XmlWriter.Create(stringWriter);

        while (xmlReader.Read())
        {
            switch (xmlReader.NodeType)
            {
                case XmlNodeType.XmlDeclaration:
                    xmlReadBuffer.WriteStartDocument();
                    break;
                case XmlNodeType.Element:
                    xmlReadBuffer.WriteStartElement(xmlReader.Name);
                    if (xmlReader.HasAttributes)
                        xmlReadBuffer.WriteAttributes(xmlReader, false);
                    if (xmlReader.IsEmptyElement)
                        goto case XmlNodeType.EndElement;
                    break;
                case XmlNodeType.EndElement:
                    if (xmlReader.Depth == 0)
                    {
                        xmlReadBuffer.WriteEndElement();
                        xmlReadBuffer.WriteEndDocument();
                        goto EndXml;
                    }
                    xmlReadBuffer.WriteEndElement();
                    break;
                case XmlNodeType.Text:
                    xmlReadBuffer.WriteString(xmlReader.Value);
                    break;
                default:
                    break;
            }
        }

    EndXml:
    xmlReadBuffer.Flush();

    XPathDocument xPathDocument = new XPathDocument(XmlReader.Create(new StringReader(stringWriter.ToString())));

非常感谢向我指出这一点的elgonzo

于 2014-08-01T16:14:58.833 回答