Wie analysiere und schreibe ich XML mit Pythons ElementTree, ohne Namespaces zu verschieben?

Unser Projekt bezieht sich auf das vorgelagerte XML dieser Form:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <appSettings>
    <add key="foo" value="default">
    ...
  </appSettings>
</configuration>

It liest / analysiert dann diese XML mit ElementTree und schreibt dann für jede App-Einstellung, die einem bestimmten Schlüssel ("foo") entspricht, einen neuen Wert, dere weiß, dass der Upstream-Prozess dies nicht tut (in diesem Fall sollte der Schlüssel "foo" den Wert "bar" haben).

Das Downstream Prozess verbraucht die gefilterte XML ist, aaahhhh ...fragi. Es wird erwartet, dass das XML in @ empfangen wirgena das Formular oben.

Wenn ich diese XML-Datei ohne Registrierung eines Namespaces parse, wird mein Baum bei der Eingabe von ElementTree folgendermaßen entstellt:

<configuration xmlns:ns0="urn:schemas-microsoft-com:asm.v1">
  <runtime>
  <ns0:assemblyBinding>
    <ns0:dependentAssembly>
      <ns0:assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
      <ns0:bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" />
    </ns0:dependentAssembly>
  </ns0:assemblyBinding>
 </runtime>
 <appSettings>
    <add key="foo" value="default">
    ...
 </appSettings>
</configuration>

Der nachgelagerte Prozess kann damit nicht umgehen, da er nicht klug genug ist, um zu erkennen, dass dies semantisch dasselbe ist. Daher entscheide ich mich, den Namespace zu registrieren, von dem ich weiß, dass er vom Upstream-Prozess als Standard-Namespace bereitgestellt wird, damit die Präfixe nicht überall angezeigt werden. Jetzt erhalte ich Folgendes:

<configuration xmlns="urn:schemas-microsoft-com:asm.v1">
 <runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity culture="neutral" name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect newVersion="7.0.0.0" oldVersion="0.0.0.0-6.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
 </runtime>
 <appSettings>
    <add key="foo" value="default">
    ...
 </appSettings>
</configuration>

Ich weiß nicht viel über XML, aber das schreit auch die nachgelagerte Komponente an, und es scheint mir, dass das jetzt nicht diese Standardeinstellung bedeutetxmlns jetzt bewerben beiall eingeschlossene Elemente in<configuration>, wohingegen davornu angewendet auf das<assemblyBinding> Element

Gibt es irgendeinen Weg, using ElementTree, um diesen Namespace so zu behandeln, dass ich das XML des Upstreams aufnehmen kann, setzefooeben Sie den Wert von @ weiter, ohne den Namespace zu verschieben und genau so zu belassen, wie ich ihn gefunden hab

Ich könnte eine lxml-basierte Lösung verwenden, die dies zu handhaben scheint,jedoc, lxml hat eine Abhängigkeit von C, die die Downstream-Komponente eigentlich nicht unterstützen müsste: Eine reine Python-Lösung ist vorzuziehen.

Ich könnte das Dokument als HTML lesen, das das Namespace-Attribut ignoriert, den gewünschten Wert ändern und dann das Dokument weitergeben.jedoc, Ich habe noch keinen Python-Parser gefunden, der nicht alle Elementnamen herunterfährt, und meine nachgelagerte Komponente erfordert, dass die Groß- und Kleinschreibung aller Elementnamen beibehalten wird.

Ich könnte auf String-Parsing und reguläre Ausdrücke zurückgreifen. Ich würde lieber keinen eigenen Parser schreiben.

Der einzige Rat, den ich bisher zur Behandlung von Namespaces in ElementTree finden konnte, ist der Vorschlag, einen Standard-Namespace zu registrieren, um Präfixe zu vermeiden. Ich habe angenommen, dass er geeignet ist, aber ElementTree besteht darauf, das @ zu verschiebexmlns Deklaration bis zum Wurzelknoten beim Dump.

Ich könnte auch schlau sein, eine Zeichenkette aufzubauen, die den Baum in Stufen und in genau der richtigen Reihenfolge ablädt, um das @ zu platzierexmlnsdeklaration wieder auf den "richtigen knoten", aber das kommt mir auch so verdammt zerbrechlich vor.

Hat es jemand geschafft, ein Problem wie dieses zu überwinden?

Antworten auf die Frage(0)

Ihre Antwort auf die Frage