2

我正在尝试使用lxml. 这是我的代码:

nsmap = {
    'svg': 'http://www.w3.org/2000/svg',
    'xlink': 'http://www.w3.org/1999/xlink',
}

root = etree.XML(svg)

# this works (finds the element with the given ID)
root.xpath('./svg:g/svg:g/svg:g[@id="route_1_edge"]', namespaces=nsmap)

# this yields "XPathEvalError: Invalid expression"
root.xpath('./svg:g/svg:g/svg:g[fn:startswith(@id,"route_1")]', namespaces=nsmap)

有人知道为什么第一个有效而第二个无效吗?如果我将第三个更改svg:gsvg:text我没有得到异常,那么它似乎与g元素有关,特别是它不喜欢的元素,但是,再次,简单的g[@id="foo"]搜索工作正常。

4

1 回答 1

3

“startswith”函数拼写为starts-with。另外,省略fn:.

root.xpath('./svg:g/svg:g/svg:g[starts-with(@id,"route_1")]', namespaces=nsmap)

import lxml.etree as etree
import lxml.builder as builder

nsmap = {
    'svg': 'http://www.w3.org/2000/svg',
    'xlink': 'http://www.w3.org/1999/xlink',
}

E = builder.ElementMaker(
    namespace='http://www.w3.org/2000/svg',
    nsmap=nsmap)

root = (
    E.root(
        E.g(
            E.g(
                E.g(id = "route_1_edge" )))))

print(etree.tostring(root, pretty_print=True))
print(root.xpath('./svg:g/svg:g/svg:g[@id="route_1_edge"]', namespaces=nsmap))
print(root.xpath('./svg:g/svg:g/svg:g[starts-with(@id,"route_1")]', namespaces=nsmap))

产量

<svg:root xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <svg:g>
    <svg:g>
      <svg:g id="route_1_edge"/>
    </svg:g>
  </svg:g>
</svg:root>

[<Element {http://www.w3.org/2000/svg}g at 0xb7462c34>]
[<Element {http://www.w3.org/2000/svg}g at 0xb7462be4>]
于 2013-03-18T21:33:05.760 回答