C# 使用LINQ使用C从HTML中提取所有隐藏的输入#

C# 使用LINQ使用C从HTML中提取所有隐藏的输入#,c#,linq,string,linq-to-xml,C#,Linq,String,Linq To Xml,您好,我有以下来自webclient代码的HTML <body onLoad="window.focus()"> <form name="form1" method="post" action="/www/www.do"> <input type="hidden" name="value1" value="aaaa"> <input type="hidden" name="value2" value="bbbb"> <input type="

您好,我有以下来自webclient代码的HTML

<body onLoad="window.focus()">
<form name="form1" method="post" action="/www/www.do">
<input type="hidden" name="value1" value="aaaa">
<input type="hidden" name="value2" value="bbbb">
<input type="hidden" name="value3" value="cccc">
<input type="hidden" name="value4" value="dddd">
<input type="hidden" name="value5" value="eeee">

more html.....

</body>

更多html。。。。。

如何提取使用C#linq或string函数隐藏的输入类型的所有名称和值?

使用HtmlAgilityPack,可以执行以下操作:

var doc = new HtmlWeb().Load("http://www.mywebsite.com");
var nodes = doc.DocumentNode.SelectNodes("//input[@type='hidden' and @name and @value]");
foreach (var node in nodes) {
    var inputName = node.Attributes["name"].Value;
    var inputValue = node.Attributes["value"].Value;
    Console.WriteLine("Name: {0}, Value: {1}", inputName, inputValue);
}
如果要从文本文件而不是URL加载文档,可以执行以下操作:

var doc = new HtmlDocument();
doc.Load(@"C:\file.html");
var query = from f in doc.DocumentNode.DescendantNodes()
            where f.Name == "input" && f.GetAttributeValue("type", "") != ""
                    && f.Attributes.Contains("name") && f.Attributes.Contains("value")
            select new
                        {
                            f.Attributes["value"].Value,
                            f.Attributes["name"].Name
                        };

foreach (var q in query) {
    Console.WriteLine("Name: {0}, Value: {1}", q.Name, q.Value);
}
如果仍要使用LINQ,因为
SelectNodes
返回一个
HtmlNodeCollection
,它是一个
IEnumerable
,您可以执行以下操作:

var doc = new HtmlDocument();
doc.Load(@"C:\file.html");
var query = from f in doc.DocumentNode.DescendantNodes()
            where f.Name == "input" && f.GetAttributeValue("type", "") != ""
                    && f.Attributes.Contains("name") && f.Attributes.Contains("value")
            select new
                        {
                            f.Attributes["value"].Value,
                            f.Attributes["name"].Name
                        };

foreach (var q in query) {
    Console.WriteLine("Name: {0}, Value: {1}", q.Name, q.Value);
}

我发布了一个如何做到这一点的工作示例。