4 Stimmen

Python zur "Umwandlung" von YAML in XML

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

1voto

Gringo Suave Punkte 27545

Ich würde die XSD vermeiden, das klingt nach viel Bürokratie für wenig Gewinn.

  1. Erstellen Sie eine YAML-Datei mit derselben Hierarchie wie die XML-Datei.
  2. Datei mit pyyaml laden
  3. Schleife über das Ergebnis, das den entsprechenden Baum in elementtree erzeugt.
  4. Baum in XML-Datei schreiben
  5. XML an das System senden, wenn es sich beschwert, YAML korrigieren und zu Schritt 2 zurückkehren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X