Frage

Ich mag die Ergebnisse von drei Zip-Filterabfragen auf einer XML-Struktur kombinieren. Die XML Ich Parsen sieht wie folgt aus:

<someroot>
  <publication>
    <contributors>
      <person_name>
        <surname>Surname A</surname>
      </person_name>
      <person_name>
        <given_name>Given B</given_name>
        <surname>Surname B</surname>
        <suffix>Suffix B</suffix>
      </person_name>
    </contributors>
  </publication>
</someroot>

Aus diesem Beispiel Sie, dass <given_name> sehen und <suffix> sind optional - nur <surname> erforderlich ist. Hier in Lügen mein Problem - wenn ich laufen drei separate Abfragen die Antworten Ich werde raus aus dem Gleichgewicht geraten miteinander:

(xml-> xml :publication :contributors :person_name :given_name text)
(xml-> xml :publication :contributors :person_name :surname text)
(xml-> xml :publication :contributors :person_name :suffix text)

Nachdem diese drei Ausführen von Abfragen ich mit drei Sequenzen, deren Mächtigkeiten gelassen werde, nicht übereinstimmen; given_name und suffix werden Länge 1 während surname Länge seiner 2. Das macht es mir unmöglich, die Komponenten jedes Name zu kombinieren. Ich brauche eine einzelne Abfrage zu schreiben, die diesen Namen Verkettung während der Sequenz Aufbau durchführen wird.

Ich freue mich auf die sehr spärliche Dokumentation für clojure.contrib.zip-filter.xml und kann nicht herausfinden, wie ich dies tun könnte (oder wenn es überhaupt möglich ist). Leider bin ich ein Clojure (und Lisp) Neuling! Kann jemand Punkt, wie ich eine Abfrage schreiben, die drei andere eingebettete Abfragen verketten werden?

War es hilfreich?

Lösung

Sie können alle Person Teilbäume in einem Schritt erhalten (xml-> xmlzip: Veröffentlichung: Mitwirkende: PERSON_NAME) dann die Namensteile, wenn sie vorhanden sind (xml1-> personzip: Name Text) und kombinieren sie zu dem Ergebnis, die Sie wollen etwa so:

(use 'clojure.contrib.zip-filter.xml)
(defn format-name
  [surname given suffix]
  (str surname (if given (str ", " given)) (if suffix (str ", " suffix))))
(defn get-names
  [xz] 
  (map (juxt 
         #(xml1-> % :surname text) 
         #(xml1-> % :given_name text) 
         #(xml1-> % :suffix text))
     (xml-> xz :publication :contributors :person_name)))
(let [x (clojure.zip/xml-zip (clojure.xml/parse "foo.xml"))] 
  (map (partial apply format-name) (get-names x)))

Ergebnisse in ( "Nachname A" "Nachname B, Gegeben B, Suffix B")

Andere Tipps

nehme ich eine alternative Lösung zu

(xml-> xml :publication :contributors :person_name)

und dann jeden <person_name> verarbeiten später.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top