2

我在这里向您请教QXmlQueryXpath方面的帮助。我正在尝试使用这种组合从几个 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 "code" 中:

QStringList fields, values;
QXmlQuery query;

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

我的目标是获取所有字段(Hauteur、Largeur、Profondeur、Poids 等)及其值(1127 mm、640 mm、685 mm、159.6 kg 等)。

问题 1

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

问题2

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

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

//*[@id="idTab2"]/*[2]/string()给出:Nothing

所以,如果我没记错的话, li 标签中的文本不被视为子节点,但它应该是。请参阅已接受的答案:直接在节点中选择文本,而不是在子节点中

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

4

1 回答 1

1

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

//*[@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>(<span>不是文本节点) 的直接子节点的文本节点,并删除前导和尾随空白字符 ( normalize-space())

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

最后一个给出“159.6 kg”

于 2013-08-26T10:08:28.063 回答