[lxml-dev] Using the Xpath id function
Floris Bruynooghe
floris.bruynooghe at gmail.com
Wed Jul 2 11:34:49 CEST 2008
Hi
I've sent this to comp.lang.python a few days ago with no repsonse, so
I hope you don't mind if I try here (if there is a better place please
let me know)...
Basically I'm trying to use the .xpath('id("foo")') method on an lxml tree but
can't get it to work.
Given the following XML: <root><child id="foo"/></root>
And it's XMLSchema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="child"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="child">
<xs:complexType>
<xs:attribute name="id" use="required" type="xs:ID"/>
</xs:complexType>
</xs:element>
</xs:schema>
Or in more readable, compact RelaxNG, form:
element root {
element child {
attribute id { xsd:ID }
}
}
Now I'm trying to parse the XML and use the .xpath() method to find
the <child/> element using the id XPath function:
from lxml import etree
schema_root = etree.parse(file('schema.xsd'))
schema = etree.XMLSchema(schema_root)
parser = etree.XMLParser(schema=schema)
root = etree.fromstring('<root><child id="foo"/></root>', parser)
root.xpath('id("foo")') --> []
I was expecting to get the <child/> element with that last statement
(well, inside a list that is), but instead I just get an empty list.
Is there anything obvious I'm doing wrong? As far as I can see the
lxml documentation says this should work.
Cheers
Floris
For completeness, `dpkg -l python-lxml' tells me I'm using Debian
lenny's lxml 2.0.6-1
--
Debian GNU/Linux -- The Power of Freedom
www.debian.org | www.gnu.org | www.kernel.org
More information about the lxml-dev
mailing list