LXML中标签的多个XML命名空间
我正在尝试使用Python的LXML库来创建一个GPX文件,这个文件可以被Garmin的Mapsource产品读取。他们的GPX文件的头部看起来是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1"
creator="MapSource 6.15.5" version="1.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
当我使用以下代码时:
xmlns = "http://www.topografix.com/GPX/1/1"
xsi = "http://www.w3.org/2001/XMLSchema-instance"
schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
version = "1.1"
ns = "{xsi}"
getXML = etree.Element("{" + xmlns + "}gpx", version=version, attrib={"{xsi}schemaLocation": schemaLocation}, creator='My Product', nsmap={'xsi': xsi, None: xmlns})
print(etree.tostring(getXML, xml_declaration=True, standalone='Yes', encoding="UTF-8", pretty_print=True))
我得到的结果是:
<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\'?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/1" xmlns:ns0="xsi"
ns0:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
version="1.1" creator="My Product"/>
结果中有一个让人烦恼的ns0
标签。虽然这可能是完全有效的XML格式,但Mapsource并不喜欢这个标签。
有没有办法让这个文件中不出现ns0
标签呢?
1 个回答
16
问题出在你的属性名称上。
attrib={"{xsi}schemaLocation" : schemaLocation},
这会把schemaLocation放在xsi命名空间里。
我想你是想要
attrib={"{" + xsi + "}schemaLocation" : schemaLocation}
使用xsi的URL。这和你在元素名称中使用的命名空间变量是一致的。这样就把这个属性放在了 http://www.w3.org/2001/XMLSchema-instance
的命名空间里。
这样就会得到
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
version="1.1"
creator="My Product"/>