MSHTML 解析 ARTICLE 标签无效

Invalid parsing ARTICLE tag by MSHTML

我正在 Delphi 10 Seattle 尝试通过 MSHTML 解析器解析 HTML。它工作正常,但 ARTICLE 标签混淆了它,解析的 ARTICLE 元素没有内部 HTML 和子元素,尽管它们在那里。

    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.

程序的输出是

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>

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

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

查看文档:custom element | custom object

The Windows Internet Explorer support for custom tags on an HTML page requires that a namespace be defined for the tag. Otherwise, the custom tag is treated as an unknown tag when the document is parsed. Although navigating to a page with an unknown tag in Internet Explorer does not result in an error, unknown tags have the disadvantage of not being able to contain other tags, nor can they have behaviors applied to them.

在你的例子中 ARTICLE 是一个 unknown 标签。要使其成为可以包含其他标签的 custom 标签,您需要为其添加命名空间。例如<MY:ARTICLE> 并声明命名空间 <html XMLNS:MY>(如果您不声明命名空间,DOM 解析器将自动添加它)

另请参阅:Using Custom Tags in Internet Explorer


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

您的程序默认运行在IE7兼容模式下,因此MSHTML不知道这个特殊标签并将其视为未知标签。

所以要么尝试添加 <!DOCTYPE html> 作为 HTML 的第一行,然后添加 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 作为 HEAD 部分的第一行(它必须是第一个).或者尝试添加 FEATURE_BROWSER_EMULATION 注册表项:How to have Delphi TWebbrowser component running in IE9 mode?

P.S: idoc.designMode := 'on'; 不需要。