Qt:QXmlQuery和XPath

时间:2013-08-26 09:47:09

标签: c++ qt xpath

我在这里向您询问 QXmlQuery Xpath 的帮助。 我正在尝试使用此组合从多个HTML文档中提取一些数据。 下载这些文档,然后使用HTML Tidy Library清除。

问题是当我尝试使用XPath时。这是一个示例代码:

[...]
    <ul class="bullet" id="idTab2">
        <li><span>Hauteur :</span> 1127 mm</li>
        <li><span>Largeur :</span> 640 mm</li>
        <li><span>Profondeur :</span> 685 mm</li>
        <li><span>Poids :</span> 159.6 kg</li>
[...]

干净的代码存储在QString“代码”中:

QStringList fields, values;
QXmlQuery query;

query.setFocus(code);
query.setQuery("//*[@id=\"idTab2\"]/*/*/string()");
query.evaluateTo(&fields);

我的目标是获得所有领域(Hauteur,Largeur,Profondeur,Poids等)及其价值(1127毫米,640毫米,685毫米,159.6千克等)。

问题1

正如您所看到的,我使用此XPath //*[@id="idTab2"]/*/*/string()来恢复字段,因为://ul[@id="idTab2"]/li/span/string()不起作用。当我尝试指定标签名称时,它什么也没给我。它仅适用于*。为什么?我检查了整洁函数返回的代码,XPath没有改变。所以,我没有看到任何问题。这是正常的吗?或者也许有一些我不知道的事情......

问题2

在之前的XHTML代码中,li标签包含span标签和一些文本。我不知道如何只获取文本而不是span标记的内容。我试过了:

//*[@id="idTab2"]/*/string()提供:Hauteur : 1127 mm Largeur : 640 mm Profondeur : 685 mm

//*[@id="idTab2"]/*[2]/string()提供:Nothing

所以,如果我没错,li标签中的文本不被视为子节点,但应该是。请参阅接受的答案:Select just text directly in node, not in child nodes

感谢阅读,希望有人能帮助我。

1 个答案:

答案 0 :(得分:1)

要获取不同<li>内的元素(不是文本表示),您可以测试文本内容:

//*[@id=\"idTab2\"]/li[starts-with(span, "Hauteur")]

其他项目相同:

//*[@id=\"idTab2\"]/li[starts-with(span, "Largeur")]
//*[@id=\"idTab2\"]/li[starts-with(span, "Profondeur")]
//*[@id=\"idTab2\"]/li[starts-with(span, "Poids")]

要获取这些<li>的字符串表示形式,您可以在整个表达式周围使用string(),如下所示:

string(//*[@id=\"idTab2\"]/li[starts-with(span, "Poids")])

给出“Poids:159.6 kg”

要仅提取<li>中的文本节点,而不提取<span>,您可以使用这些表达式,这些表达式选择<li>的直接子节点的文本节点({{1 }}不是文本节点),并删除前导和尾随空格字符(<span>

normalize-space()

最后一次给出“159.6公斤”