2011-03-29 56 views
4

1.背景Python的 「轉換」 成YAML XML

我們必須依賴於幾個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綁定,或者我如何使其通用性足以工作可靠。

乾杯, 維克多

回答

1

我會避免XSD,聽起來很多官僚而收效甚微。

  1. 創建與XML文件具有相同層級的YAML文件。
  2. 用pyyaml加載文件
  3. 循環結果在elementtree中創建等效樹。
  4. 將樹寫入XML文件
  5. 將XML發送到系統,當它發出抱怨時,修復YAML並返回到步驟2。