XQuery - 用解密值(db2)替换xml值

时间:2017-10-16 04:24:18

标签: xml db2 xquery

我有一块XML需要扫描并用解密的值替换所有加密值。我有一个解密函数,需要解密的xml元素将有一个属性表明它们是加密的。并非所有值都被加密,并且返回的XML必须与起始XML相同,除了新的解密值。 无论如何我都能想到这样做。我是xquery的新手。

示例下面的xml



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

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

提前谢谢。

1 个答案:

答案 0 :(得分: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>