2016-05-18 17 views
6

Próbuję parsować HTML przez parser MSHTML w Delphi 10 Seattle. Działa dobrze, ale tag ARTYKUŁ myl go, analizowany element ARTYKUŁ nie ma innerHTML i dzieci, mimo że są tam.Nieprawidłowy parsujący tag ARTYKUŁA przez 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. 

Wyjście programu jest

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> 

Jak widać, istnieją błędy z tagiem artykułu, nie ma treści i/artykuł jest definiowana jako oddzielnego tagu.

Czy ktoś może mi pomóc zrozumieć ten problem?

Odpowiedz

6

Zobacz dokumenty: custom element | custom object.

Obsługa Windows Internet Explorer dla niestandardowych znaczników na stronie HTML wymaga zdefiniowania przestrzeni nazw dla tagu. W przeciwnym razie niestandardowy znacznik jest traktowany jako nieznany znacznik podczas analizowania dokumentu. Mimo, przechodząc do strony z nieznanego tagu w programie Internet Explorer nie powoduje błędu nieznane znaczniki mają tę wadę, że nie mogąc zawierać inne znaczniki, ani też nie mogą mieć Zachowania stosowane do nich.

W twoim przypadku ARTICLE jest nieznany tag. Aby to był znacznik niestandardowy, który może zawierać inne znaczniki, musisz dodać do niego przestrzeń nazw. na przykład <MY:ARTICLE> i zadeklarować nazw <html XMLNS:MY> (jeśli nie deklarują nazw parser DOM doda automatycznie)

Zobacz także: Using Custom Tags in Internet Explorer


W swoim komentarzu wspomniałeś, że twój starają się analizować na żywo Strona HTML5 (nie wspomniałeś o tym w pytaniu).
Ponieważ nie jestem ekspertem HTML5, nie przypisałem tagu ARTICLE do standardów HTML5.

Twój program działa domyślnie w trybie zgodności z IE7, dlatego też MSHTML nie wie o tym specjalnym znaczniku i traktuje go jako nieznany tag.

Więc albo spróbuj dodać <!DOCTYPE html> jako pierwszą linię kodu HTML i dodaj <meta http-equiv="X-UA-Compatible" content="IE=edge"> jako pierwszą linię sekcji HEAD (musi być pierwsza). Lub spróbuj dodać klucz rejestru FEATURE_BROWSER_EMULATION: How to have Delphi TWebbrowser component running in IE9 mode?

P.S: idoc.designMode := 'on'; nie jest potrzebny.

+0

masz rację, z dodaną przestrzenią nazw html został poprawnie przeanalizowany. ale ARTYKUŁ nie jest tagiem niestandardowym, jest tagiem HTML5, a oryginalna strona html z prawdziwego źródła jest z powodzeniem analizowana przez IE 11 (muszę parsować stronę na żywo, niestety). Czy to oznacza, że ​​mam problemy ze zgodnością IE? W każdym razie, dziękuję bardzo za wyjaśnienie! –

+0

Masz rację, problem został rozwiązany przez dodanie klucza zgodności do rejestru. Chociaż oryginalny dokument został zdefiniowany za pomocą znaczników . Wielkie dzięki! –

+0

Nie ma za co. – kobik