2009-09-10 2 views
1

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

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

Что делает XML-файл выглядит? –

+0

@ Гуннар: Брюс прав. Не видя XML, который вы используете, невозможно ответить на ваш вопрос. Без этой информации ваше выражение XPath выглядит идеально; конечно, это может быть 100% неправильно для XML, который у вас есть. –

+0

XML содержит много данных. Это документ XHTML. Я вижу из ошибок синтаксического анализа XML, что он некорректен в нескольких местах. –

ответ

0

Любая возможность вам избежать /?

+2

Нет, это Delphi. –

3

В примере кода, который я нашел в Интернете для метода selectNodes, ему предшествует код, который устанавливает свойство документа посредством 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 namespace, поэтому попробуйте следующее:

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

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

selectNodes does not give node list when xmlns is used на форуме Microsoft.

+0

Я не думаю, что это причина здесь. Кроме того, setProperty существует только в IXMLDOMDocument2, а не в документе IXMLDOMDocument. –

1

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'); 
3

Если вы просто пытаетесь загрузить простой 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'. 
+1

Это было очень полезно для меня, parseError поймал ошибку ID10T с моей стороны. –

Смежные вопросы