2016-05-18 15 views
6

Tôi đang cố gắng phân tích cú pháp HTML bằng trình phân tích cú pháp MSHTML ở Delphi 10 Seattle. Nó hoạt động tốt, nhưng thẻ ARTICLE gây nhầm lẫn nó, phân tích yếu tố ARTICLE không có innerHTML và trẻ em, mặc dù chúng ở đó.Phân tích cú pháp thẻ ARTICLE không hợp lệ theo 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. 

Output của chương trình là

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> 

Như bạn thấy, có lỗi với thẻ ĐIỀU, nó không có nội dung và/ĐIỀU được định nghĩa là thẻ riêng biệt.

Ai đó có thể giúp tôi hiểu vấn đề này không?

Trả lời

6

Xem tài liệu: custom element | custom object.

Windows Internet Explorer hỗ trợ cho các thẻ tùy chỉnh trên một trang HTML đòi hỏi một không gian tên được định nghĩa cho thẻ. Nếu không, thẻ tùy chỉnh được coi là thẻ không xác định khi tài liệu được phân tích cú pháp. Mặc dù điều hướng đến một trang với một thẻ chưa biết trong Internet Explorer không dẫn đến một lỗi, thẻ chưa biết có những bất lợi của việc không có khả năng chứa các thẻ khác, cũng không phải họ có thể có những hành vi áp dụng đối với họ.

Trong trường hợp của bạn ARTICLEkhông rõ thẻ. Để làm cho thẻ tùy chỉnh có thể chứa các thẻ khác, bạn cần thêm không gian tên vào thẻ. ví dụ. <MY:ARTICLE> và khai báo namespace <html XMLNS:MY> (nếu bạn không khai báo không gian tên phân tích cú pháp DOM sẽ thêm nó tự động)

Xem thêm: Using Custom Tags in Internet Explorer


Trong bình luận của bạn, bạn nói rằng bạn đang cố gắng để phân tích một live Trang HTML5 (Bạn không đề cập đến điều đó trong câu hỏi).
Vì tôi không phải là chuyên gia HTML5, tôi không liên kết thẻ ARTICLE với tiêu chuẩn HTML5.

Chương trình của bạn đang chạy trong chế độ tương thích IE7 theo mặc định và do đó MSHTML không biết về thẻ đặc biệt này và coi đó là thẻ không xác định.

Vì vậy, hãy thử thêm <!DOCTYPE html> làm dòng đầu tiên của HTML và thêm <meta http-equiv="X-UA-Compatible" content="IE=edge"> làm dòng đầu tiên của phần HEAD (nó phải là đầu tiên). Hoặc cố gắng thêm FEATURE_BROWSER_EMULATION khóa đăng ký: How to have Delphi TWebbrowser component running in IE9 mode?

P.S: idoc.designMode := 'on'; là không cần thiết.

+0

bạn đúng, với html không gian tên đã thêm được phân tích cú pháp chính xác. nhưng ARTICLE không phải là thẻ tùy chỉnh, đó là thẻ HTML5 và trang html gốc từ nguồn thực được phân tích cú pháp bởi IE 11 thành công (tôi cần phân tích trang trực tiếp, không may). Nó có nghĩa là tôi có vấn đề với khả năng tương thích của IE? Dù sao, cảm ơn bạn rất nhiều vì đã giải thích! –

+0

Bạn đã đúng, vấn đề đã được giải quyết bằng cách thêm khóa tương thích vào sổ đăng ký. Mặc dù, tài liệu gốc được xác định bằng thẻ . Cảm ơn rất nhiều! –

+0

Bạn được chào đón. – kobik

Các vấn đề liên quan