我們必須依賴於幾個XML配置文件的應用程序。 XML文件定義了連接設置,輪詢頻率,多個用戶帳戶(使用XSD嵌套類型/序列)等等。
我有這些XML文件的XSD架構。下面小編摘錄:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="FooExch" type="CConfigFooType"/>
<xs:complexType name="CConfigFooType">
<xs:sequence>
<xs:element name="_appID" type="xs:string"/>
...
<xs:element name="_logins" type="FooLoginsType" maxOccurs="unbounded"/>
<xs:element name="_passwords" type="FooPasswordType" maxOccurs="unbounded"/>
...
</xs:sequence>
</xs:complexType>
<xs:complexType name="FooLoginsType">
<xs:sequence>
<xs:element name="_name" type="xs:string"/>
<xs:element name="_adapterID" type="xs:int"/>
<xs:element name="_FooLogins" type="FooAccountType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="FooAccountType">
<xs:sequence>
<xs:element name="_FooAccount" type="xs:string"/>
<xs:element name="_mktFeed" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="FooPasswordType">
<xs:sequence>
<xs:element name="_name" type="xs:string"/>
<xs:element name="_password" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
目的
我們的目標是讓用戶更方便地調整或添加設置。
我想提供一個採用YAML文件的腳本,並基於XSD輸出XML配置(缺省值的缺省回退,可能位於default.yaml
文件中)。
我們還需要能夠將YAML「附加」到XML中,因爲用戶可以擁有一個只定義其用戶帳戶的YAML,並且我們會將其導入現有的用戶帳戶列表在現有的XML文件中。
3.方法
到目前爲止,我使用GenerateDS(http://www.rexx.com/~dkuhlman/generateDS.html)生成從XSD一個Python包裝。
使用它,我可以創建一個表示XML模式的Python對象,然後將它們導出到XML。
現在的問題是我如何從YAML到XML?
理想情況下,我想要一個通用循環,只是運行每個值,並將其添加到Python表示。
我最初的想法是使用getattr(config_wrapper, "yaml_name") = yaml_value
並遍歷YAML中的每個值,然後捕獲AttributeError
中的任何不在XSD中的內容。
我的第一個問題 - 這個方法有什麼問題,或者是否有更多的Pythonic /清潔方法?有沒有更聰明的方法來解決這個問題?
我的第二個問題是 - 對於上面的XSD部分,我們需要使用用戶名/密碼進行嵌套登錄。我知道PyYAML提供了嵌套集合,但是我還不太確定這將如何與GenerateDS綁定,或者我如何使其通用性足以工作可靠。
乾杯, 維克多