XPath-Abfrage in hierarchischen Daten, wobei die Vorfahren-Nachkommen-Beziehung erhalten bleibt

  • Wie kann ich in PostgreSQL ausdrücken, dass ich Werte gleichzeitig aus mehreren Hierarchieebenen in einer XPath-Abfrage möchte?

    I haben ein Dokument (in einem PostgreSQL-Wert XML) mit einer mehrstufigen Hierarchie. Für diese Frage kann ein Beispiel erstellt werden mit:

     SELECT XMLPARSE(DOCUMENT '
        <parrots>
            <parrot name="Fred">
                <descriptor>Beautiful plumage</descriptor>
                <descriptor>Resting</descriptor>
            </parrot>
            <parrot name="Ethel">
                <descriptor>Pining for the fjords</descriptor>
                <descriptor>Stunned</descriptor>
            </parrot>
        </parrots>
        ') AS document
    INTO TEMPORARY TABLE parrot_xml;
     

    Ich kann verschiedene Informationsebenen aus diesem Dokument abrufen.

     => SELECT
            (XPATH('./@name', parrot.node))[1] AS name
        FROM (             
            SELECT
                UNNEST(XPATH('./parrot', parrot_xml.document))
                    AS node
            FROM parrot_xml
            ) AS parrot
        ;
     name  
    -------
     Fred
     Ethel
    (2 rows)
    
    => SELECT
            (XPATH('./text()', descriptor.node))[1] AS descriptor
        FROM (
            SELECT
                UNNEST(XPATH('./parrot/descriptor', parrot_xml.document))
                    AS node
            FROM parrot_xml
            ) AS descriptor
        ;
          descriptor       
    -----------------------
     Beautiful plumage
     Resting
     Pining for the fjords
     Stunned
    (4 rows)
     

    Was ich jedoch nicht herausfinden kann, ist, wie mehrere Ebenen zusammengefügt werden können, sodass die Abfrage jeden Deskriptor zurückgibt, der mit dem Papagei zusammenhängt, für den er gilt.

     => SELECT
            ??? AS name,
            ??? AS descriptor
        FROM
            ???
        ;
     
      name         descriptor       
    ------- -----------------------
     Fred    Beautiful plumage     
     Fred    Resting               
     Ethel   Pining for the fjords 
     Ethel   Stunned               
    (4 rows)
     

    Wie kann das gemacht werden Was sollte an Stelle der? ????? s gehen?

    Eine einzelne komplexe XPath-Abfrage - aber wie kann man sich auf mehrere Ebenen gleichzeitig beziehen? Mehrere XPath-Abfragen - aber wie werden dann die Vorfahren-Nachkommen-Informationen für die resultierende Beziehung beibehalten? Noch etwas?

    26 November 2011
    Erwin Brandstetter
0 answers