2010-03-05 2 views
22

Beispiel HTML:Wie alle Eingabeelemente in einer Form mit HtmlAgilityPack zu erhalten, ohne einen Nullreferenzfehler zu bekommen

<html><body> 
    <form id="form1"> 
     <input name="foo1" value="bar1" /> 
     <!-- Other elements --> 
    </form> 
    <form id="form2"> 
     <input name="foo2" value="bar2" /> 
     <!-- Other elements --> 
    </form> 
</body></html> 

Prüfregeln:

HtmlDocument doc = new HtmlDocument(); 
doc.Load(@"D:\test.html"); 
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input")) 
{ 
    Console.WriteLine(node.Attributes["value"].Value);    
} 

Die Aussage doc.GetElementbyId("form2").SelectNodes(".//input") gibt mir einen NULL-Verweis.

Alles, was ich falsch gemacht habe? Vielen Dank.

Antwort

40

Sie können folgendes tun:

HtmlNode.ElementsFlags.Remove("form"); 

HtmlDocument doc = new HtmlDocument(); 

doc.Load(@"D:\test.html"); 

HtmlNode secondForm = doc.GetElementbyId("form2"); 

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

    if (valueAttribute != null) 
    { 
     Console.WriteLine(valueAttribute.Value); 
    } 
} 

von Standard-HTML-Agility-Pack parst Formen als leerer Knoten, weil sie erlaubt sind andere HTML-Elemente zu überlappen. Die erste Zeile (HtmlNode.ElementsFlags.Remove("form");) deaktiviert dieses Verhalten, sodass Sie die Eingabeelemente innerhalb des zweiten Formulars abrufen können.

Update: Beispiel Formelemente überlappen:

<table> 
<form> 
<!-- Other elements --> 
</table> 
</form> 

Das Element innerhalb einer Tabelle beginnt aber außerhalb des Tabellenelements geschlossen. Dies ist in der HTML-Spezifikation erlaubt und HTML Agility Pack muss damit umgehen.

+0

Bedeutet dies, dass, außer Sie 'HtmlNode.ElementsFlags.Remove (" form ");' verwenden, es nicht möglich ist, untergeordnete Elemente von 'form' Elementen über HAP zu analysieren? –

+0

@Kevin, ich kenne keine andere Alternative. –

+1

5 Jahre später - immer noch eine Anforderung, immer noch die richtige Antwort. Auch sollte noch im Paket selbst geändert werden ... – getglad

Verwandte Themen