#c# #html #winforms #html-agility-pack
#c# #HTML #winforms #html-agility-pack
Вопрос:
Я пытаюсь перечислить все узлы в HTML-форме, которая у меня есть, динамически, используя HTML agility pack, что означает, что я не знаю имен атрибутов и входных имен. Проблема в том, что я хочу получить метку, соответствующую входным данным.
<form name="input" action="html_form_action.asp" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>
Итак, здесь я хочу написать имя пользователя, а затем входные данные, в этом примере это кажется действительно очевидным, но иногда они не являются прямыми братьями и сестрами, может быть много скрытых входных данных или других тегов.
Другой пример:
<input type=hidden name="startDate">
<TR> <TD bgColor=#008088 colSpan=2 class="headfont">
<FONT color=#FFFFFF> <B>* Enter ur username and password</B> </FONT>
</TD></TR>
<TR>
<TD bgColor=#9ccdcd class="datafont"><FONT color=black>Username</FONT></TD>
<TD bgColor=#9ccdcd class="datafont">
<INPUT tabIndex=1 name=stuNum
autocomplete="off" size="20"></TD></TR>
<TR>
Я использую C # winforms в своем проекте.
У меня есть несколько идей, но они займут много времени, поэтому я подумал, что, поскольку я новичок в HTML agility pack, был бы способ или какой-нибудь короткий путь, чтобы получить его,,, Есть предложения?
Комментарии:
1. Есть ли у вас какие-либо примеры, когда скрытые входные данные или другие теги могли бы помешать? Будут ли другие текстовые узлы, которые могут присутствовать, но которые вы хотите игнорировать? У меня есть несколько идей, но я не знаю, сработает ли это в ваших случаях.
Ответ №1:
Что-то вроде этого должно сработать.
static IEnumerable<Tuple<string, HtmlNode>> GetInputNodes(HtmlDocument doc, params string[] fields)
{
var form = doc.DocumentNode.SelectSingleNode("//form");
foreach (var field in fields)
{
var fieldNode = form.ChildNodes
.OfType<HtmlTextNode>()
.Where(node => node.Text.Trim().StartsWith(field, StringComparison.OrdinalIgnoreCase))
.SingleOrDefault();
if (fieldNode == null)
continue;
var input = FindCorrespondingInputNode(fieldNode);
if (input != null)
yield return Tuple.Create(field, input);
}
}
static HtmlNode FindCorrespondingInputNode(HtmlTextNode fieldNode)
{
for (var currentNode = fieldNode.NextSibling;
currentNode != null amp;amp; currentNode.NodeType != HtmlNodeType.Text;
currentNode = currentNode.NextSibling)
{
if (currentNode.Name == "input"
amp;amp; !currentNode.Attributes["type"].Value.Contains("hidden"))
{
return currentNode;
}
}
return null;
}
Затем, чтобы использовать его, просто введите имена полей, для которых вы хотите получить элементы ввода.
GetInputNodes(doc, "username");
Просто предупреждение, похоже, что HtmlAgilityPack не закрывает форму, как, вероятно, следовало бы. Таким образом, вам придется указать, что элементы формы должны быть закрыты перед загрузкой html. Без этого HAP не распознает, что у формы есть дочерние узлы.
var doc = new HtmlDocument();
HtmlNode.ElementsFlags["form"] = HtmlElementFlag.Closed;
doc.Load(url);
Комментарии:
1. Большое спасибо, но проблема здесь в том, что я не знаю «имя пользователя», это был просто пример.