es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transformar nodos de memoria a JSON

Necesito convertir el nodo de memoria a JSON. Resultado esperado:

{
    "citations": [
        {
            "cited": "classes",
            "procceding": [
                "applied",
                "considered",
                "followed"
            ]
        },
        {
            "cited": "toCase",
            "procceding": [
                "Ty Corp Ltd v Nu Inc",
                "PY Arbitrage v Bank of WN"
            ]
        }
    ]
}

Mi XQuery:

let $nodes :=
    <cases>
        <citations>
            <classes>
                <text>applied</text>
                <text>considered</text>
                <text>followed</text>
            </classes>
            <tocase>
                <text>Ty Corp Ltd v Nu Inc</text>
                <text>PY Arbitrage v Bank of WN</text>
            </tocase>
        </citations>
    </cases>
return
let $map := map:map()
let $p :=
    for $node in $nodes/citations/node()
    let $nodeName := local-name($node)
    let $c :=
        map:put($map, "citations", map:new(map:entry('cited', map:new(map:entry($nodeName, (for $value in $node/node() return $value/fn:string(.)))))))
    return $c
return xdmp:to-json($map)

$nodes se transforma incorrectamente en:

{"citations": {"cited": {"toCase": ["Ty Corp Ltd v Nu Inc", "PY Arbitrage v Bank of WN"]}}}

¿Cómo puedo obtener el JSON esperado?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida JSON esperada, el código XQuery debe actualizarse de la siguiente manera:

    let $nodes :=
    <cases>
      <citations>
        <classes>
          <text>applied</text>
          <text>considered</text>
          <text>followed</text>
        </classes>
        <tocase>
          <text>Ty Corp Ltd v Nu Inc</text>
          <text>PY Arbitrage v Bank of WN</text>
        </tocase>
      </citations>
    </cases>
    
    return
      let $map := map:map()
      let $citations := map:map()
      let $citationNodes := $nodes//citations/*
      for $citationNode in $citationNodes
      let $cited := local-name($citationNode)
      let $proceedings := $citationNode/*
      let $proceedingsList := (for $proceeding in $proceedings return string($proceeding))
      let $citation := map:entry("cited", map:entry($cited, $proceedingsList))
      let $_ := map:put($citations, $citation)
      let $_ := map:put($map, "citations", $citations)
      return xdmp:to-json($map)
    

    El código XQuery actualizado convierte la variable $nodes en la salida esperada mediante:

    1. Creando un nuevo objeto map:map() llamado $map.
    2. Creando un nuevo objeto map:map() llamado $citations.
    3. Seleccionando todos los elementos en $nodes que coinciden con la expresión XPath //citations/*, que selecciona todos los elementos secundarios del elemento citations.
    4. Iterando a través de cada uno de los elementos secundarios del elemento citations y almacenando el nombre local del elemento en una variable llamada $cited.
    5. Almacenando todos los elementos secundarios del elemento de citación actual en una variable llamada $proceedings.
    6. Convirtiendo $proceedings en una lista de cadenas mediante la iteración a través de cada elemento secundario y convirtiéndolo a una cadena utilizando la función string().
    7. Almacenando las variables $cited y $proceedingsList en un objeto map:entry() llamado $citation.
    8. Almacenando cada objeto $citation en el objeto de mapa $citations utilizando map:put().
    9. Almacenando el objeto de mapa $citations en el objeto de mapa $map utilizando map:put().
    10. Convirtiendo $map a JSON utilizando xdmp:to-json().

    La salida resultante es:

    {
        "citations": [
            {
                "cited": "classes",
                "classes": [
                    "applied",
                    "considered",
                    "followed"
                ]
            },
            {
                "cited": "toCase",
                "toCase": [
                    "Ty Corp Ltd v Nu Inc",
                    "PY Arbitrage v Bank of WN"
                ]
            }
        ]
    }
    

Comments are closed.