在Delphi中使用XPath查找元素

时间:2009-09-10 15:55:05

标签: delphi xpath

我试图在Delphi中的XML文档中找到一个元素。我有这个代码,但它总是在日志中说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 个答案:

答案 0 :(得分:3)

在我在线查找selectNodes方法的示例代码中,前面是代码,用于通过setProperty设置文档的SelectionNamespaces属性。有些人甚至设置了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

答案 1 :(得分: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'.

答案 2 :(得分: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 :(得分:0)

你需要逃避/?

的任何可能性