2017-10-16 12 views
0

私はすべての暗号化された値をスキャンして復号化された値で置き換える必要があるXMLのブロックを持っています。私は解読関数を持っており、解読される必要のあるxml要素には、それらが暗号化されていることを示す属性があります。すべての値が暗号化されているわけではなく、返されるXMLは、新しい暗号化された値を除いて開始XMLと同一でなければなりません。 とにかくこれをすると思います。私はxqueryを初めて使用しています。例えば、XML予めXQuery - xml値を復号化された値(db2)に置き換えます。

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

おかげ以下

+0

それは、z/OS用やLinux/UNIX/Windows上のDB2上ですか?これまでに何を試しましたか? –

+0

あなたは、コンテンツが暗号化されている(正確に)内容を解読されているが、コンテンツがまだ暗号化されている(偽の)要素で置き換えたいとしますか?この行動を指定し、重度のカウンセリングを行うデザイナーを探してください。 –

+0

コードはデータベースパッケージとしてデータベース内で実行されているので、私はxqueryを使用しようとしていますが、これについてどうやってどうやっていくのかちょっと困惑しています。主な問題は、私が列が暗号化されていることをあらかじめ知っているわけではないので、手続きは一般的でなければならないということです。 –

答えて

0

以下は、xQuery 1.0の安全なソリューションです。それはよりコンパクトにすることができますが、完全なレビューのためにこれのように残されています。

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) 

リターン:

<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> 
関連する問題