2017-10-16 3 views
0

Ich habe einen XML-Block, den ich alle verschlüsselten Werte mit einem entschlüsselten Werte scannen und ersetzen muss. Ich habe eine Entschlüsselungsfunktion und die XML-Elemente, die entschlüsselt werden müssen, haben ein Attribut, das angibt, dass sie verschlüsselt sind. Nicht alle Werte sind verschlüsselt, und der zurückgegebene XML-Code muss bis auf neue entschlüsselte Werte mit dem XML-Start identisch sein. Ich kann mir überlegen, ob ich das überhaupt machen soll. Ich bin neu in xquery.XQuery - XML-Werte durch entschlüsselten Wert ersetzen (db2)

Beispiel xml unter

<book> 
 
    <title encrypted=true>0234534rdf;skdlfsd</title> 
 
    <author>J K. Rowling</author> 
 
    <year>2005</year> 
 
    <price>29.99</price> 
 
</book>

<book> 
 
    <title encrypted=true>Harry Potter</title> 
 
    <author>J K. Rowling</author> 
 
    <year>2005</year> 
 
    <price>29.99</price> 
 
</book>

Dank im Voraus.

+0

Ist das auf DB2 für z/OS oder Linux/Unix/Windows-? Was hast du bisher versucht? –

+0

Sie wollen also ein Element ersetzen, das (korrekt) sagt, dass sein Inhalt mit einem Element verschlüsselt ist, dessen Inhalt entschlüsselt ist, aber (fälschlicherweise) besagt, dass der Inhalt noch verschlüsselt ist? Finden Sie den Designer, der dieses Verhalten spezifiziert und strenge Beratung verabreicht. –

+0

Der Code wird in der Datenbank als Datenbank-Paket ausgeführt, also habe ich versucht, xquery zu verwenden, aber ich bin ein wenig ratlos, wie das geht. Hauptproblem ist, dass ich vorher nicht weiß, welche Spalten verschlüsselt sind, also muss die Prozedur generisch sein. –

Antwort

0

Unten sollte eine xQuery 1.0 sichere Lösung sein. Es könnte kompakter sein, aber bleibt so für eine vollständige Überprüfung.

xquery version "1.0"; 

declare function local:encrypt($node){ 
    'an encrypted value' 
}; 

declare function local:decrypt($node){ 
    'a decrypted value' 
}; 


declare function local:traverse-and-encrypt($nodes as node()*) as node()*{ 
    for $n in $nodes 
    return if($n/@encrypted = 'true') 
    then element{fn:node-name($n)}{ 
     for $a in $n/@* 
     return if(fn:local-name($a) = 'encrypted') 
      then attribute {'encrypted'} {'false'} 
      else $a, 
     local:decrypt($n/text()) 
    } 
    else if($n/@encrypted = 'false') 
     then element{fn:node-name($n)}{ 
     for $a in $n/@* 
      return if(fn:local-name($a) = 'encrypted') 
      then attribute {'encrypted'} {'true'} 
      else $a, 
     local:encrypt($n/text()) 
     } 
     else element{fn:node-name($n)}{ 
     $n/@*, 
     $n/text(), 
     for $child in $n/* 
      return local:traverse-and-encrypt($child) 
     } 
}; 

let $doc := 
<books> 
    <book> 
    <title encrypted="true">0234534rdf;skdlfsd</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
    <book> 
    <title encrypted="false">Another book</title> 
    <author test='testing attributes'>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 
</books> 

return local:traverse-and-encrypt($doc) 

kehrt:

<books> 
    <book> 
     <title encrypted="false">a decrypted value</title> 
     <author>J K. Rowling</author> 
     <year>2005</year> 
     <price>29.99</price> 
    </book> 
    <book> 
     <title encrypted="true">an encrypted value</title> 
     <author test="testing attributes">J K. Rowling</author> 
     <year>2005</year> 
     <price>29.99</price> 
     </book> 
</books> 
Verwandte Themen