2016-05-18 10 views
6

Sto cercando di analizzare HTML con parser MSHTML in Delphi 10 Seattle. Funziona bene, ma i tag ARTICLE lo confondono, l'elemento ARTICLE analizzato non ha innerHTML e figli, sebbene siano lì.Tag ANALOGICO non valido per l'analisi di 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. 

uscita del programma è

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> 

Come si vede, ci sono errori con tag articolo, non ha contenuto e/ARTICOLO è definito come tag separato.

Qualcuno può aiutarmi a capire questo problema?

risposta

6

Vedere i documenti: custom element | custom object.

Il supporto di Windows Internet Explorer per tag personalizzati in una pagina HTML richiede che venga definito uno spazio dei nomi per il tag. In caso contrario, il tag personalizzato viene considerato come tag sconosciuto quando il documento viene analizzato. Anche se la navigazione verso una pagina con un tag sconosciuto in Internet Explorer non si traduca in un errore, tag sconosciuti hanno lo svantaggio di non essere in grado di contenere altri tag, né possono avere comportamenti applicati a loro.

Nel tuo caso ARTICLE è uno sconosciuto tag . Per trasformarlo in un tag personalizzato che può contenere altri tag, è necessario aggiungervi spazio dei nomi. per esempio. <MY:ARTICLE> e dichiarare lo spazio dei nomi <html XMLNS:MY> (se non si dichiara lo spazio dei nomi il parser DOM aggiungerà automaticamente)

Vedi anche: Using Custom Tags in Internet Explorer


Nel suo commento lei ha detto che il vostro stanno cercando di analizzare un live Pagina HTML5 (non l'hai menzionata nella domanda).
Poiché non sono un esperto HTML5, non ho associato il tag ARTICLE agli standard HTML5.

Il programma è in esecuzione in modalità di compatibilità IE7 per impostazione predefinita e, pertanto, MSHTML non conosce questo tag speciale e lo tratta come tag sconosciuto.

Quindi, provare ad aggiungere <!DOCTYPE html> come prima riga dell'HTML e aggiungere <meta http-equiv="X-UA-Compatible" content="IE=edge"> come prima riga della sezione HEAD (deve essere prima). Oppure prova ad aggiungere la chiave di registro FEATURE_BROWSER_EMULATION: How to have Delphi TWebbrowser component running in IE9 mode?

P.S: idoc.designMode := 'on'; non necessaria.

+0

hai ragione, con lo spazio dei nomi aggiunto html è stato analizzato correttamente. ma ARTICLE non è un tag personalizzato, è un tag HTML5, e la pagina html originale di Real Source viene analizzata da IE 11 con successo (ho bisogno di analizzare la pagina live, sfortunatamente). Significa che ho problemi con la compatibilità di IE? Comunque, grazie mille per la spiegazione! –

+0

Hai ragione, il problema è stato risolto aggiungendo la chiave di compatibilità al registro. Sebbene il documento originale sia stato definito con tag . Molte grazie! –

+0

Prego. – kobik

Problemi correlati