1. Hintergrund
Wir haben eine Anwendung, die von mehreren XML-Konfigurationsdateien abhängt. Die XML-Dateien definieren Dinge wie Verbindungseinstellungen, Abfragefrequenzen, mehrere Benutzerkonten (unter Verwendung von XSD verschachtelten Typen/Sequenzen) usw.
Ich habe das XSD-Schema für diese XML-Dateien. Kleiner Auszug unten:
<?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. Zielsetzung
Unser Ziel ist es, den Nutzern das Ändern oder Ergänzen von Einstellungen zu erleichtern.
Ich würde gerne ein Skript anbieten, das eine YAML-Datei nimmt und basierend auf der XSD eine XML-Konfiguration ausgibt (mit Standard-Fallbacks für fehlende Werte, vielleicht in einer default.yaml
Datei.).
Wir bräuchten auch die Möglichkeit, eine YAML an die XML-Datei "anzuhängen", d.h. ein Benutzer könnte eine YAML-Datei haben, die nur sein Benutzerkonto definiert, und wir würden diese in die bestehende Liste der Benutzerkonten in einer bestehenden XML-Datei importieren.
3. Annäherung an
Bislang verwende ich GenerateDS (http://www.rexx.com/~dkuhlman/generateDS.html), um einen Python-Wrapper aus der XSD zu generieren.
Auf diese Weise kann ich ein Python-Objekt erstellen, das das XML-Schema darstellt, und es dann nach XML exportieren.
Das Problem ist nun, wie komme ich von einer YAML-Datei zu einer XML-Datei?
Im Idealfall möchte ich eine allgemeine Schleife, die nur über jeden Wert lief, und fügte es der Python-Darstellung.
Mein erster Gedanke war die Verwendung von getattr(config_wrapper, "yaml_name") = yaml_value
und über jeden Wert in der YAML iterieren, dann abfangen AttributeError
für alles, was nicht in der XSD enthalten war.
Meine erste Frage - sind alle Probleme zu diesem Ansatz, oder gibt es vielleicht eine mehr Pythonic / sauberer Weg, dies zu tun? Gibt es einen intelligenteren Weg, diese Frage zu lösen?
Meine zweite Frage ist - mit dem obigen Teil der XSD, müssen wir verschachtelte Logins, mit Benutzernamen/Passwörter haben. Ich weiß, PyYAML bietet verschachtelte Sammlungen, aber ich bin immer noch nicht ganz sicher, wie dies in GenerateDS binden würde, oder wie ich es generisch genug, um zuverlässig zu arbeiten machen könnte.
Zum Wohl, Victor