HTML 애자 팩을 동적으로 사용하는 HTML 양식의 모든 노드를 나열하려고합니다. 즉 속성 및 입력 이름의 이름을 모르는 것입니다. 문제는 입력에 해당하는 레이블을 가져 오려는 경우입니다.
<form name="input" action="html_form_action.asp" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>
그래서 여기에 Username 다음에 입력을 쓰고 싶습니다.이 예제에서는 정말 분명해 보이지만 때로는 형제가 아니기 때문에 많은 숨겨진 입력이나 다른 태그가있을 수 있습니다.
다른 예시:
<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 민첩성 팩에 익숙하지 않은 경우 방법이나 단축키가 될 수 있다고 생각 했었습니다.
이런 식으로하면 효과가 있습니다.
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 && currentNode.NodeType != HtmlNodeType.Text;
currentNode = currentNode.NextSibling)
{
if (currentNode.Name == "input"
&& !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);