C# - 如何通过HTTP读取连续的XML流

7 c# xml http httpwebrequest

我试图找出从服务中获取连续XML数据流的最佳方法,该服务将数据作为"常量"Feed通过HTTP发送.

我正在考虑使用HttpWebRequest/Response但我不确定如果数据只是连续流式传输会如何表现.

有什么想法吗?

esa*_*sac 9

我之前已经完成了这项工作,不是使用XML,而是需要针对应用程序的状态更改解析数据.HttpWebResponse.GetResponseStream()方法对此工作正常.完成后,请务必在此流上调用Close().我建议最终阻止.

HttpWebRequest req;

try
{
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com");
    Stream stream = req.GetResponseStream();

    byte[] data = new byte[4096];
    int read;
    while ((read = data.Read(data, 0, data.Length)) > 0)
    {
         Process(data, read);
    }
}
finally
{
    if (req != null)
        req.Close();
}
Run Code Online (Sandbox Code Playgroud)

或者,或者:

HttpWebRequest req;

try
{
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com");
    Stream stream = req.GetResponseStream();

    XmlTextReader reader = new XmlTextReader(stream);

    while (reader.Read())
    {
       switch (reader.NodeType) 
        {
         case XmlNodeType.Element:
           Console.Write("<{0}>", reader.Name);
           break;
         case XmlNodeType.Text:
           Console.Write(reader.Value);
           break;
         case XmlNodeType.CDATA:
           Console.Write("<![CDATA[{0}]]>", reader.Value);
           break;
         case XmlNodeType.ProcessingInstruction:
           Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
           break;
         case XmlNodeType.Comment:
           Console.Write("<!--{0}-->", reader.Value);
           break;
         case XmlNodeType.XmlDeclaration:
           Console.Write("<?xml version='1.0'?>");
           break;
         case XmlNodeType.Document:
           break;
         case XmlNodeType.DocumentType:
           Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
           break;
         case XmlNodeType.EntityReference:
           Console.Write(reader.Name);
           break;
         case XmlNodeType.EndElement:
           Console.Write("</{0}>", reader.Name);
           break;
       }       

    }       
}
finally
{
    if (req != null)
        req.Close();
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为为了使代码有效,需要进行一些小的修改.没有`HttpWebRequest.GetResponseStream()`方法.你需要使用`HttpWebRequest.GetResponse()`得到一个`HttpWebResponse`对象,并在其上调用`GetResponseStream()`.同样在`finally`块中,`req`不是要使用,而是前面提到的`Response`. (3认同)