Недопустимый тег статьи синтаксического анализа MSHTML

Я пытаюсь разобрать HTML с помощью парсера MSHTML в Delphi 10 Seattle. Он отлично работает, но тег статьи путает его, разбираемый элемент статьи не имеет innerHTML и детей, хотя они есть.

    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 определяется как отдельный тег.

может кто-нибудь помочь мне понять эту проблему?

1 ответов


посмотреть документы: пользовательский элемент / пользовательский объект.

поддержка Windows Internet Explorer пользовательских тегов на HTML-странице требуется определить пространство имен для тега. В противном случае пользовательский тег обрабатывается как неизвестный тег при анализе документа. Хотя переход на страницу с неизвестным тегом в Internet Explorer не приводит к ошибке,неизвестные теги имеют недостаток не будучи в состоянии чтобы содержать другие теги, и они не могут применять поведение к ним.

в вашем случае ARTICLE Это неизвестный тег. Чтобы сделать это таможни тег, который может содержать другие теги, вам нужно добавить пространство имен к нему. например,<MY:ARTICLE> и объявить пространство имен <html XMLNS:MY> (Если вы не объявите пространство имен, парсер DOM добавит его автоматически)

Читайте также: использование пользовательских тегов в Интернете Исследователь!--11-->


в своем комментарии Вы упомянули, что пытаетесь проанализировать живую страницу HTML5 (вы не упомянули об этом в вопросе).
Поскольку я не эксперт HTML5, я не связал ARTICLE тег к стандартам HTML5.

ваша программа работает в режиме совместимости IE7 по умолчанию, и поэтому MSHTML не знает об этом специальном теге и рассматривает его как неизвестный тег.

поэтому либо попробуйте добавить <!DOCTYPE html> в качестве первой строки HTML и добавить <meta http-equiv="X-UA-Compatible" content="IE=edge"> как первая строка HEAD раздел (он должен быть первым). Или попробуйте добавить FEATURE_BROWSER_EMULATION ключ реестра: как запустить компонент Delphi TWebbrowser в режиме IE9?

П. С.: idoc.designMode := 'on'; не требуется.