How do I query a gbXML file?

Querying a gbXML file using lxml

A gbXML file can be queried using the standard properties of the lxml Element class.

from lxml import etree

tree=etree.parse('gbXMLStandard.xml')
gbxml=tree.getroot()

# query an attribute
print(gbxml.attrib['version'])
# prints "0.37"

# query a child element
print(gbxml[0].tag)
# prints "{http://www.gbxml.org/schema}Campus"

# query element text
print(gbxml[0][0][0].text)
# prints "52939_2004"

Note the final query is the text for the ‘StationId’ element, located in ‘gbXML/Camus/Location’.

Querying a gbXML file using XPATH

gbXML files opened in lxml can also be queried using XPATH.

from lxml import etree

tree=etree.parse('gbXMLStandard.xml')
gbxml=tree.getroot()

ns={'gbxml':'http://www.gbxml.org/schema'}

# query an attribute
print(gbxml.xpath('./@version')[0])
# prints "0.37"

# query a child element
print(gbxml.xpath("./gbxml:*", namespaces=ns)[0].tag)
# prints "{http://www.gbxml.org/schema}Campus"

# query element text
print(gbxml.xpath(".//gbxml:StationId/text()", namespaces=ns)[0])
# prints "52939_2004"

Additional querying methods provided by xgbxml

In xgbxml, additional properties are available to query the gbXML file:

from lxml import etree
import xgbxml

parser=xgbxml.get_parser('0.37')

tree=etree.parse('gbXMLStandard.xml', parser)
gbxml=tree.getroot()

# query an attribute
print(gbxml.version)
# prints "0.37"

# query a child element
print(gbxml.Campus.tag)
# prints "{http://www.gbxml.org/schema}Campus"

# query element text
print(gbxml.Campus.Location.StationId.text)
# prints "52939_2004"

The additional properties that xgbxml supplies include:

  • attributes for accessing gbXML element attributes (i.e. version)

  • attributes for accessing gbXML child elements (i.e. Campus)

Advanced querying using xgbxml

xgbxml attributes can query for multiple child elements (i.e. gbxml.Campus.Surfaces).

These can also be nested (i.e. gbxml.Campus.Surfaces.Openings).

from lxml import etree
import xgbxml

parser=xgbxml.get_parser('0.37')

tree=etree.parse('gbXMLStandard.xml', parser)
gbxml=tree.getroot()

print(len(gbxml.Campus.Surfaces))
# prints "2590"

print(len(gbxml.Campus.Surfaces.Openings))
# prints "138"

This shows that the gbXML file has 2,590 surfaces and 138 openings.