Поиск элементов с помощью XPath в Delphi - PullRequest
1 голос
/ 10 сентября 2009

Я пытаюсь найти элемент в документе XML в Delphi. У меня есть этот код, но он всегда говорит 0 элементов в журнале:

function TForm1.KannaSidu: Boolean;
var
  Doc: IXMLDOMDocument; 
  List: IXMLDomNodeList;
begin
  try
    Doc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
    Doc.async:=False;
    Doc.load(Filename);
  except
    LogTx('Error on page');
  end;
  List:=Doc.selectNodes('/html/head');
  LogTx(IntToStr(List.length)+' elements');
  Result:=False;
end;

Так как мне заставить XPath работать?

Ответы [ 4 ]

3 голосов
/ 11 сентября 2009

Если вы просто пытаетесь загрузить обычный html-файл в формате xml, у него, вероятно, будет несколько причин для сбоя и задохнуться от таких вещей, как:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

Вы должны проверить, что он действительно загружается правильно, прежде чем делать что-либо еще:

  if not Doc.load(filename) then
    raise Exception.Create('XML Loading error:' + Trim(Doc.parseError.reason));

Это даст вам конкретную причину сбоя, подобную этой:

XML Loading error:End tag 'head' does not match the start tag 'link'.
3 голосов
/ 10 сентября 2009

В примере кода, который я нахожу онлайн для метода selectNodes, ему предшествует код, который устанавливает свойство документа SelectionNamespaces через setProperty. Некоторые даже устанавливают SelectionLanguage тоже.

Doc.setProperty('SelectionLanguage', 'XPath');
Doc.setProperty('SelectionNamespaces',
  'xmlns:xsl=''http://www.w3.org/1999/XSL/Transform''');

Судя по именам элементов, которые вы ищете, вы обрабатываете HTML-файл. Основные элементы HTML находятся в пространстве имен http://www.w3.org/1999/xhtml , поэтому попробуйте следующее:

Doc.setProperty('SelectionNamespaces',
  'xmlns:x=''http://www.w3.org/1999/xhtml''');
List := Doc.selectNodes('/x:html/x:head');

Смотри также:

selectNodes не выдает список узлов при использовании xmlns на форуме Microsoft.

1 голос
/ 10 сентября 2009

IXMLDOMDocument.Load() не вызывает исключение, если что-то не так с вашим файлом или его содержимым. Попробуйте следующее, чтобы убедиться, что в этом нет ничего плохого:

...
Doc.load(Filename);
if Doc.parseError.errorCode <> 0 then
  ShowMessage('Error : ' + + Doc.parseError.reason) 
else
  ShowMessage('No problem so far !');
...

Я сосу на XPath, но, возможно, если html является вашим корневым узлом, вам не нужно включать его в строку запроса, поэтому попробуйте следующее:

List:=Doc.selectNodes('//html/head');

или

List:=Doc.selectNodes('//head');
0 голосов
/ 10 сентября 2009

Есть ли у вас возможность избежать /?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...