2017-10-16 4 views
0

모든 암호화 된 값을 검사하여 decrytped 값으로 대체해야하는 XML 블록이 있습니다. 나는 암호 해독 기능을 가지고 있고 암호 해독이 필요한 xml 요소는 암호화되었음을 나타내는 속성을가집니다. 모든 값이 암호화되지는 않으며 리턴 된 XML은 새로운 해독 된 값을 제외하고 시작 XML과 동일해야합니다. 어쨌든이 작업을 수행 할 수 있다고 생각할 수 있습니다. 나는 xquery를 처음 사용합니다.XQuery - xml 값을 암호 해독 된 값 (db2)으로 바꿉니다.

예시 XML 사전

<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 용 또는 리눅스/유닉스/윈도우에서 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>