2010-08-11 10 views
1

我正在通過需要大量條件語句的Python腳本生成複雜的XML文件(示例http://repository.azgs.az.gov/uri_gin/azgs/dlio/536/iso19139.xml)。我正在處理多個XML或ASCII元數據標準,這些標準通常具有較差的模式或者非常模糊。XML或ASCII字符串/模板的Python內聯?

在PHP中,我只寫了XML並在需要的地方插入了PHP代碼片段。有沒有一種簡單的方法來在Python中做到這一點?我試圖避免必須逃避所有的XML。內聯方法對於調整模板而不用重寫很有幫助。

我已經看了一下Python模板解決方案,但他們似乎太靜態或過度殺傷。在更改XML或ASCII模板時,將整個XML移動到XML對象中需要付出很大的努力。

感謝您的新手支持!

回答

1

wgrunberg,

我使用Python的內置string.Template類像這樣:

from string import Template 
the_template = Template("<div id='$section_id'>First name: $first</div>") 
print the_template.substitute(section_id="anID", first="Sarah") 

的上述的輸出是:

<div id='anID'>First name: Sarah</div> 

在上面的例子我展示一個XML模板,但是任何可以描述爲字符串的「模板」都可以工作。

要做到條件語句,你可以這樣做:

print the_template.substitute(section_id="theID", first="Sarah" if 0==0 else "John") 

如果你的條件等都很複雜,而不是如上表示他們在線,可以考慮將它們分爲關閉/功能。

1

嘗試任何現代非基於XML的Python模板引擎,例如MakoJinja2。他們是相當容易集成到你的項目,然後你就可以寫的東西,如:

<sometag> 
%if a > b: 
    <anothertag /> 
%endif 
</sometag> 

您還可以使用inline python,包括分配。

1

@Gintautas建議使用一個好的模板引擎也是我的第一選擇(特別是Mako,他的「模板語言」基本上是Python和一些標記;-)。然而,許多人更喜歡構建XML文件的替代方案包括從DOM寫入它們,例如,使用(堅持使用標準庫中的東西)ElementTree或(第三方包,但零安裝並且非常受歡迎)BeautifulSoup(除非您使用Python 3,否則堅持使用其3.0.x版本!) ,特別是BeautifulStoneSoup類(BeautifulSoup類用於處理HTML,這是XML的基石)。

0

尋找模板是明智的做法。在外部庫中使用內置字符串模板將是我首選的方法,因爲我需要能夠輕鬆地將Python ETL腳本傳遞給其他人。但是,我可以通過將XML字符串放在單引號內並使用多行字符串來避免使用模板。以下是這種粗略方法的一個例子。

for row in metadata_dictionary: 
     iso_xml = '' 
     iso_xml += ' *** a bunch of XML *** ' 
     iso_xml += '\ 
<gmd:contact> \n\ 
    <gmd:CI_ResponsibleParty> \n' 
     if row['MetadataContactName']: 
      iso_xml += '\ 
     <gmd:individualName> \n\ 
     <gco:CharacterString>'+row['MetadataContactName'].lower().strip()+'</gco:CharacterString> \n\ 
     </gmd:individualName> \n' 
     if row['MetadataContactOrganisation']: 
      iso_xml += '\ 
     <gmd:organisationName> \n\ 
     <gco:CharacterString>'+row['MetadataContactOrganisation'].lower().strip()+'</gco:CharacterString> \n\ 
     </gmd:organisationName> \n' 
     iso_xml += ' *** more XML *** '