F
Floris Bruynooghe
Hi
I'm trying to use the .xpath('id("foo")') function 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
I'm trying to use the .xpath('id("foo")') function 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