2010-05-17 66 views
12

我正在尝试使用Pythons LXML库创建一个可由Garmin的Mapsource产品读取的GPX文件。他们GPX文件头看起来像这样使用LXML标记中的多个XML名称空间

<?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标签?

回答

11

问题出在您的属性名称上。

attrib={"{xsi}schemaLocation" : schemaLocation}, 

将schemaLocation放入xsi命名空间中。

我认为你的意思

attrib={"{" + xsi + "}schemaLocation" : schemaLocation} 

使用的URL XSI。这与您在元素名称中使用名称空间变量相匹配。它把属性在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"/> 
+0

的结果看,这就是为什么我是一个业余的和为生活不代码! 完美答案。 谢谢! – lonerockz 2010-05-20 00:14:24

相关问题