Ich möchte meinen Asics-Laufplan nach iCal exportieren und da Asics diesen Service nicht anbietet, habe ich beschlossen, einen kleinen Schaber für meinen eigenen persönlichen Gebrauch zu bauen. Ich möchte alle geplanten Runs aus meinem Plan nehmen und daraus einen iCal-Feed generieren. Ich verwende C # und Html Agility Pack.
Ich möchte alle geplanten Läufe durchlaufen (sie sind Div-Knoten). Als nächstes möchte ich ein paar verschiedene Knoten mit meinen Laufknoten auswählen. Mein Code sieht so aus:
foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
number++;
string date = run.SelectSingleNode("//div[@class='date']").InnerText;
string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
ViewData["result"] += "Dato: " + date + "<br />";
ViewData["result"] += "Tyep: " + type + "<br />";
ViewData["result"] += "Distance: " + distance + "<br />";
ViewData["result"] += "Description: " + description + "<br />";
ViewData["result"] += run.InnerHtml.Replace("<", "<").Replace(">", ">") + "<br />" + "<br />" + "<br />";
}
Mein Problem ist das run.SelectSingleNode("//div[@class='date']").InnerText
wählt nicht den Knoten mit dem angegebenen XPath innerhalb des angegebenen run.SelectSingleNode("//div[@class='date']").InnerText
. Es wählt den ersten Knoten aus, der dem XPath im gesamten Dokument entspricht.
Wie kann ich den einzelnen Knoten mit dem angegebenen XPath innerhalb des aktuellen Knotens auswählen?
Vielen Dank.
Aktualisieren
Ich habe versucht, meine XPath-Zeichenfolge zu aktualisieren:
string date = run.SelectSingleNode(".div[@class='date']").InnerText;
Dies sollte das Element <div class="date"></div>
innerhalb des aktuellen Knotens auswählen, richtig? Nun, ich habe das versucht, aber habe diesen Fehler:
Ausdruck muss zu einem Knotensatz ausgewertet werden. Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.
Ausnahmedetails: System.Xml.XPath.XPathException: Expression muss zu einem Knotensatz ausgewertet werden.
Irgendwelche Vorschläge?
Ein paar Dinge, die Ihnen bei der Arbeit mit HtmlAgilityPack- und XPath- Ausdrücken helfen.
Wenn run
ein HtmlNode
, dann:
run.SelectNodes("//div[@class='date']")
Will verhält sich genau wie doc.DocumentNode.SelectNodes("//div[@class='date']")
run.SelectNodes("./div[@class='date']")
Geben Sie alle <div>
Knoten , die Kinder sind run
Es wird nicht tiefer suchen, nur auf der nächsttieferen Ebene.
run.SelectNodes(".//div[@class='date']")
Wir kommen wieder alle <div>
Knoten mit dieser Klasse Attribut, aber nicht nur neben dem run
sondern auch in der Tiefe (jede mögliche Abkömmling davon) suchen
Sie müssen wählen zwischen 2. oder 3., je nachdem, welche Ihre Bedürfnisse erfüllen :)
In XPATH bedeutet //
alle Kinder und Enkel unter dem aktuellen Knoten. Sie müssen also einen restriktiveren XPATH-Ausdruck erstellen. Wenn Sie das echte HTML zur Verfügung stellen und genau das, was Sie suchen, können wir Ihnen helfen, weiter zu graben.
Über den Fehler, den Sie haben:
.div[@class='date']
ist ungültig, weil .
ist an div
geklebt Sie könnten div[@class='date']
oder ./div[@class='date']
was meiner Meinung nach äquivalent ist. Dies ist weil .
ist eine XPATH-Axt , die ein Alias für self
und "der aktuelle Knoten" bedeutet.