我试图在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工作呢?
答案 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');
另见:
微软论坛上的答案 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)
你需要逃避/?
的任何可能性