Problem beim Parsen von XMLIch muss eine HTML-Seite analysieren, um einige Informationen zu extrahieren, erhalte jedoch unerwartete Ergebnisse, siehe das Skript unten.
HTMLPageAsText = "
<TITLE>String 1 i want to get</TITLE>
String 2 i want to get
<H2 id="toc-hId-1618931318" id="toc-hId-1618931318">Possibly also this</H2>
<H2 id="toc-hId--933225643" id="toc-hId--933225643">why i get only this</H2>
";
PageTitle="";
PageBody="";
Parse XML( HTMLPageAsText,
On Element( "title",
End Tag( PageTitle=XML text();show("Found title") )
),
On Element( "body",
End Tag( PageBody=XML text();show("Found body") )
),
);
show(PageTitle,PageBody);
Was ich im Idealfall in der Variablen PageBody brauche, ist:
PageBody="String 2 i want to get
<H2 id="toc-hId-809584692" id="toc-hId-809584692">Possibly also this</H2>
<H2 id="toc-hId--1742572269" id="toc-hId--1742572269">why i get only this</H2>"
oder wenn es nur möglich ist, den Inhalt des Tags abzurufen, mit Ausnahme der Untertags, die ich erwarte
PageBody="String 2 i want to get"
während Stattdessen bekomme ich Folgendes:
PageBody="why i get only this"
Was mache ich falsch?
Betreff: Problem beim Parsen von XMLDanke!
Das wird vorerst reichen.
Für zukünftige Entwicklungen könnte jedoch ein zusätzlicher Befehl für On Element() namens XML Body() sehr nützlich sein, der den gesamten Inhalt eines Tags (einschließlich des verschachtelten TAGs als Text) zurückgibt.
Was den Kommentar zu HTML vs. XML betrifft, verstehe ich, worauf es ankommt. Ich werde versuchen, das Problem zu lösen, indem ich
durch
ersetze, wenn die Webseite komplizierter wird, damit sie XML-kompatibel ist. Ich könnte mir sogar eine Schleife vorstellen, die die nicht geschlossenen Tags verfolgt und sie durch die korrekte XML-Version ersetzt. Es wäre jedoch großartig, wenn der XML-Parser eine Warnung auslösen würde, aber die Ausführung im Fehlerfall fortsetzen würde, ähnlich wie es ein Webbrowser bei fehlerhaften HTMLs tut.
Abschließend zur Dokumentation: Ich stimme zu, dass die Dokumentation für das Parsen von XML etwas minimal ist. Fügen Sie daher beim Aktualisieren bitte auch das zweite Argument für XML Attr() hinzu. Im Moment gibt die Dokumentation nur 0 und 1 mögliches Attribut an, ich habe jedoch einen Code gefunden (und verwendet), der zwei Argumente verwendet, und das zweite wäre die zurückgegebene Zeichenfolge, wenn das Attribut nicht gefunden wird.
Ich denke, dass dies eine nützliche Funktion ist, die derzeit nicht dokumentiert ist
Danke.
Betreff: Problem beim Parsen von XMLSoweit ich das beurteilen kann, fehlt nur etwas, das möglicherweise nie dokumentiert wurde: text(). ähnlich wie EndTag().
HTMLPageAsText = "
<TITLE>one of four</TITLE>
two of four
<H2 id="toc-hId-238066" id="toc-hId-238066">three of four</H2>
<H2 id="toc-hId-1743048401" id="toc-hId-1743048401">four of four</H2>
";
title = "";
body = "";
Parse XML( HTMLPageAsText,
On Element( "title",
End Tag( title = XML Text(); )
),
On Element( "body",
Text( body = body || XML Text(); ),
)
);
show(title,body);
title = „einer von vier“;
body = "zwei von vier
drei von viervier von vier“;
- Text() wird jedes Mal ausgeführt, wenn ein neuer Textausschnitt verarbeitet wird.
- HTML und XML sind normalerweise nicht dasselbe; Ihr Beispiel funktioniert, weil es auch gültiges XML ist. Eine Reihe von HTML-Befehlen, wie z. B.
, haben kein passendes und brechen ab, wenn sie in einem XML-Reader verwendet werden.
- Wenn das XML etwas komplizierter ist, müssen Sie möglicherweise auch die Verschachtelungsebenen verfolgen.
(Ich habe Ihr Beispiel überarbeitet, während ich darüber nachgedacht habe, wie es geht. Ich werde sehen, ob ich das dokumentieren kann, Danke!)