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';
不需要。
我正在 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';
不需要。