2016-05-18 13 views
6

Ich versuche, HTML von MSHTML-Parser in Delphi 10 Seattle zu analysieren. Es funktioniert gut, aber Artikel Tag verwirren es, geparsten Artikel Element hat nicht innerHTML und Kinder, obwohl sie da sind.Ungültiges Analysieren von ARTIKEL-Tag durch MSHTML

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, 
    Variants, 
    ActiveX, 
    MSHTML; 

procedure DoParse; 
var 
    idoc: IHTMLDocument2; 
    iCollection: IHTMLElementCollection; 
    iElement: IHTMLElement; 
    V: OleVariant; 
    HTML: String; 
    i: Integer; 
begin 
    Html := 
    '<html>'#10+ 
    '<head>'#10+ 
    ' <title>Articles</title>'#10+ 
    '</head>'#10+ 
    '<body>'#10+ 
    ' <article>'#10+ 
    '  <p>This is my Article</p>'#10+ 
    ' </article>'#10+ 
    '</body>'#10+ 
    '</html>'; 


    v := VarArrayCreate([0,1], varVariant); 
    v[0]:= Html; 

    idoc := CoHTMLDocument.Create as IHTMLDocument2; 
    idoc.designMode := 'on'; 
    idoc.write(PSafeArray(System.TVarData(v).VArray)); 
    idoc.close; 

    iCollection := idoc.all as IHTMLElementCollection; 
    for i := 0 to iCollection.length-1 do 
    begin 
    iElement := iCollection.item(i, 0) as IHTMLElement; 
    if assigned(ielement) then 
     WriteLN(iElement.tagName + ': ' + iElement.outerHTML); 
    end; 
end; 

begin 
    try 
    DoParse; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    ReadLN; 
end. 

Ausgabe des Programms ist

HTML: <HTML><HEAD><TITLE>Articles</TITLE> 
<META name=GENERATOR content="MSHTML 11.00.9600.18283"></HEAD> 
<BODY><ARTICLE> 
<P>This is my Article</P></ARTICLE>undefined</BODY></HTML> 
HEAD: <HEAD><TITLE>Articles</TITLE> 
<META name=GENERATOR content="MSHTML 11.00.9600.18283"></HEAD> 
TITLE: <TITLE>Articles</TITLE> 
META: 
<META name=GENERATOR content="MSHTML 11.00.9600.18283"> 
BODY: 
<BODY><ARTICLE> 
<P>This is my Article</P></ARTICLE>undefined</BODY> 
ARTICLE: <ARTICLE> 
P: 
<P>This is my Article</P> 
/ARTICLE: </ARTICLE> 

Wie Sie sehen, gibt es Fehler Artikel-Tag, es hat keinen Inhalt und/ARTIKEL wird als separater Tag definiert.

Kann mir jemand helfen, dieses Problem zu verstehen?

Antwort

6

Siehe die Dokumente: custom element | custom object.

Die Windows Internet Explorer-Unterstützung für benutzerdefinierte Tags auf einer HTML-Seite erfordert, dass ein Namespace für das Tag definiert wird. Andernfalls wird das benutzerdefinierte Tag als unbekanntes Tag behandelt, wenn das Dokument analysiert wird. Obwohl mit einem unbekannten Tag im Internet Explorer in einem Fehler führt nicht unbekannt Tags zu einer Seite navigiert haben den Nachteil, nicht andere Tags zu enthalten in der Lage, noch können sie haben Verhaltensweisen auf sie angewendet.

In Ihrem Fall ARTICLE ist ein unbekannt Tag. Um es zu einem benutzerdefinierten Tag zu machen, das andere Tags enthalten kann, müssen Sie Namespace hinzufügen. z.B. <MY:ARTICLE> und erklären den Namespace <html XMLNS:MY>

Siehe auch (wenn Sie den Namensraum der DOM-Parser automatisch fügt nicht erklären): Using Custom Tags in Internet Explorer


In Ihrem Kommentar, den Sie erwähnt, dass Ihr eine Live zu analysieren versuchen, HTML5-Seite (Sie haben das in der Frage nicht erwähnt).
Da ich kein HTML5-Experte bin, verknüpfte ich ARTICLE nicht mit HTML5-Standards.

Ihr Programm wird standardmäßig im IE7-Kompatibilitätsmodus ausgeführt, daher kennt MSHTML dieses spezielle Tag nicht und behandelt es als unbekanntes Tag.

Also versuchen Sie entweder <!DOCTYPE html> als erste Zeile des HTML hinzuzufügen und <meta http-equiv="X-UA-Compatible" content="IE=edge"> als erste Zeile des Abschnitts HEAD (es muss zuerst). Oder versuchen Sie, FEATURE_BROWSER_EMULATION Registrierungsschlüssel hinzuzufügen: How to have Delphi TWebbrowser component running in IE9 mode?

P.S: idoc.designMode := 'on'; wird nicht benötigt.

+0

Sie haben Recht, mit Namespace hinzugefügt HTML wurde korrekt analysiert. aber ARTICLE ist kein benutzerdefiniertes Tag, es ist ein HTML5-Tag, und die originale HTML-Seite aus der echten Quelle wird erfolgreich vom IE 11 analysiert (ich brauche leider eine Live-Seite zu parsen). Bedeutet es, dass ich Probleme mit der Kompatibilität von IE habe? Wie auch immer, vielen Dank für die Erklärung! –

+0

Sie haben Recht, das Problem wurde gelöst, indem der Registrierungsschlüssel den Kompatibilitätsschlüssel hinzugefügt wurde. Das Originaldokument wurde zwar mit den Tags definiert. Danke vielmals! –

+0

Gern geschehen. – kobik