我在这里向您询问 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。
感谢阅读,希望有人能帮助我。
答案 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公斤”