2012-03-27 5 views
0

Ich versuche, alle Eingabeelemente aus einem Formular zu extrahieren. Wenn ich das folgende Formular analysieren:Analysieren Formular mit HTML-Agility Pack

<form> 
<input name='test1' type='text'> 
<input name='test2' type='text'> 
<input name='test3' type='text'> 
</form> 

alles perfekt funktionierte, war HTML Agility Pack-Lage, die Eingabeelemente in Form zu erkennen, aber wenn es einen div Elternknoten wie die folgenden, wird es nicht erkannt werden.

<form> 
<div><input name='test1' type='text'></div> 
<div><input name='test2' type='text'></div> 
<div><input name='test3' type='text'></div> 
</form> 

Ich verwende den folgenden Code

HtmlNode.ElementsFlags.Remove("form"); 

foreach (HtmlAgilityPack.HtmlNode node in postForm.Elements("input")) 
{ 
    HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; 
} 

Kann mir jemand sagen, was falsch gelaufen? Danke

+0

Was hier ist postForm – Kurkula

Antwort

6

HtmlNode.Elements Methode Kind erste Generation Knoten wird passender Namen entsprechen. Nachdem Sie Ihre Eingaben in ein <div>-Tag eingegeben haben, werden sie zu untergeordneten Knoten der zweiten Generation für das Formularelement.

Um Ihren Code Arbeit HtmlNode.Descendants Methode machen verwenden, die alle absteigenden Knoten mit passendem Namen erhält:

foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input")) 
{ 
    HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; 
} 
2

Ich erinnere mich nicht, was "" tut, aber ich nehme an, dass es nur die Kinder Knoten zurückgibt ... und in Ihrem Fall sind die direkten Kinder Ihres Formulars divs.

können Sie XPath verwenden, um ein wenig mehr Kontrolle zu haben:

.SelectNodes("//form/div/input") 

Dadurch wird eine Liste von Eingangsknoten in einer Form zurückkehren, wohl wissend, dass die Eingabe einen div-Tag ist withing.

Hier sehen Sie eine XPATH TUTORIAL mit Beispielen.

2

Verwenden Descendants() statt Elements() - die später funktioniert nur auf direkte Kinder aber Ihre Eingabeelemente sind in divs verschachtelt:

foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input")) 
{ 
    HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; 
}