2017-10-16 25 views
0

J'ai un bloc de XML dont j'ai besoin pour analyser et remplacer toutes les valeurs cryptées avec une valeur decrytped. J'ai une fonction de décryptage, et les éléments xml qui doivent être déchiffrés auront un attribut indiqué qu'ils sont cryptés. Toutes les valeurs ne sont pas encodées et le XML renvoyé doit être identique au XML de départ, à l'exception des nouvelles valeurs décryptées. Je peux penser si de toute façon de le faire. je suis nouveau à xquery.XQuery - remplace les valeurs xml par la valeur décryptée (db2)

exemple XML ci-dessous

<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>

merci à l'avance.

+0

Est-ce que sur DB2 pour z/OS ou sur Linux/Unix/Windows? Qu'avez-vous essayé jusqu'à présent? –

+0

Vous voulez donc remplacer un élément qui dit (correctement) que son contenu est chiffré avec un élément dont le contenu est déchiffré mais qui dit (faussement) que le contenu est toujours chiffré? Trouver le concepteur qui a spécifié ce comportement et administrer des conseils sévères. –

+0

Le code sera exécuté dans la base de données en tant que paquet de base de données, donc j'ai essayé d'utiliser xquery, mais je suis un peu perplexe sur la façon de procéder. Le problème principal est que je ne vais pas au préalable savoir quelles colonnes sont cryptées, donc la procédure doit être générique. –

Répondre

0

Ci-dessous devrait être une solution sécurisée xQuery 1.0. Il pourrait être plus compact, mais est laissé comme ça pour un examen complet.

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) 

retours:

<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>