2

を使用してSVGドキュメントを解析しようとしてい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)

最初のものが機能し、2番目のものが機能しない理由を誰かが知っていますか?3番目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 に答える