MSHTML无效解析ARTICLE标记

Kon*_*zev 6 html delphi parsing mshtml

我正在尝试通过Delphi 10 Seattle中的MSHTML解析器解析HTML.它运行正常,但是ARTICLE标签混淆了它,解析了ARTICLE元素没有innerHTML和children,尽管它们在那里.

    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.
Run Code Online (Sandbox Code Playgroud)

程序的输出是

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>
Run Code Online (Sandbox Code Playgroud)

如您所见,ARTICLE标记存在错误,它没有内容,而/ ARTICLE被定义为单独的标记.

有人可以帮我理解这个问题吗?

kob*_*bik 6

请参阅docs:custom element | 自定义对象.

Windows Internet Explorer对HTML页面上的自定义标记的支持要求为标记定义名称空间.否则,在解析文档时,自定义标记将被视为未知标记.虽然在Internet Explorer中导航到具有未知标记的页面不会导致错误,但未知标记的缺点是无法 包含其他标记,也不能将行为应用于它们.

在你的情况下ARTICLE是一个未知的标签.要使其成为可以包含其他标记的自定义标记,您需要为其添加名称空间.例如<MY:ARTICLE>,声明命名空间<html XMLNS:MY>(如果你没有声明命名空间,DOM解析器会自动添加它)

另请参阅:在Internet Explorer中使用自定义标记


在您的评论中,您提到您正在尝试解析实时HTML5页面(您没有在问题中提到过).
由于我不是HTML5专家,因此我没有将ARTICLE标签与HTML5标准相关联.

默认情况下,您的程序在IE7兼容模式下运行,因此MSHTML不知道此特殊标记并将其视为未知标记.

因此,要么尝试添加<!DOCTYPE html>HTML作为第一行,又要添加<meta http-equiv="X-UA-Compatible" content="IE=edge">为该HEAD部分的第一行(必须是第一行).或者尝试添加FEATURE_BROWSER_EMULATION注册表项:如何在IE9模式下运行Delphi TWebbrowser组件?

PS:idoc.designMode := 'on';不需要.