1

我正在尝试从 webResposne 仅记录第 3 行(或第 1 到第 3 行,如果无法仅记录一行)。

这是我现在使用的代码片段。

StreamReader read = new StreamReader(myHttpWebResponse.GetResponseStream(), System.Text.Encoding.UTF8);
        String result = read.ReadToEnd();
        Log("Access", Server.HtmlEncode(result), "Success");

我得到以下输出

<html>
<head>
    <title>Access is Granted.</title>
    <style>
     body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
     p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
     b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
     H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
     H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
...

等等。

我只想记录“(title>Access is Granted.(/title>”)而不打印任何其他内容(或该行之后的任何内容)。

我该怎么做呢?

谢谢

4

6 回答 6

1

构建扩展方法:

public static IEnumerable<string> ReadLines(this StreamReader reader)
{
     yield return reader.ReadLine();
}

然后你可以使用 LINQ 选择你想要的任何一行,下面的例子是选择第三行:

 var result  = streamReader.ReadLines()
                           .ElementAtOrDefault(2);

您仍然可以通过这种方式利用延迟执行

于 2013-01-28T17:14:34.600 回答
1

正则表达式可以解决问题。简单的例子:

string test = @"<html>\n<head>\n<title>Access is Granted.</title>\n<style>...";
string output = Regex.Match(test, "<title>.*</title>").Value;
于 2013-01-28T17:17:15.733 回答
1

如果您需要阅读特定行而不是using ,则ReadToEnd应该查看 using ReadLine,那么您应该能够计算读取的行数以了解何时到达所需的行。

于 2013-01-28T16:50:34.143 回答
1

您可以将所有行读入一个数组,以便您可以通过索引引用特定行。

于 2013-01-28T16:55:40.527 回答
0

Use HtmlAgilityPack.

Run the response through it and extract the line(s) you need.

Plain and simple

于 2013-01-28T16:58:05.593 回答
0

如何使用 anXmlReader从 HTML 文档中读取您想要的确切值?由于XmlReader是流式传输,因此您不必像使用数组方法那样阅读整个文档,它会自动为您解析它。这比依赖<title>标签在某一行更安全。

using(var reader = XmlReader.Create(myHttpWebResponse.GetResponseStream()))
{
    reader.ReadToDescendant("title");
    var result = "<title>" + reader.ReadElementString() + "</title>";
    Log("Access", Server.HtmlEncode(result), "Success");
}
于 2013-01-28T17:01:11.593 回答