Python将YAML“转换”为XML

时间:2011-03-29 02:51:30

标签: python xml yaml

1。背景

我们有一个依赖于多个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>

2。目标

我们的目标是让用户更轻松地调整或添加设置。

我想提供一个带有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 个答案:

答案 0 :(得分:1)

我会避开XSD,听起来像很多官僚机构,收获甚微。

  1. 创建与XML文件具有相同层次结构的YAML文件。
  2. 使用pyyaml加载文件
  3. 循环结果,在elementtree中创建等效树。
  4. 将树写入XML文件
  5. 向系统发送XML,当它抱怨时,修复YAML并返回步骤2.