【问题标题】:How sql convert one row from datatable to xml?sql如何将一行从数据表转换为xml?
【发布时间】:2020-09-14 19:06:30
【问题描述】:

如何将数据表中的一行转换为xml?

我有一个选择 - 例如:

select
    '0000' bank_code
    ,'0'   confirm_code
    ,'success' confirm_message
    ,sysdate trtime_trdatetime
    ,'123456789' sender_acc
    ,'aaaaaa' sender_name
    ,'123456789' reciver_acc
    ,'aaaaaa' reciver_name
    ,150 amount_value
    ,'' dsignature
from 
    dual

我需要将它的结果转换成这个输出:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope>
  <soap:Body>
    <sendfund xmlns="http://blabla.com/">
      <bank>
        <code>string</code>
      </bank>
      <transaction>
        <confirm>
          <code>string</code>
          <message>string</message>
        </confirm>
        <trtime>
          <trdatetime> </trdatetime>
        </trtime>
        <sender>
          <acc>string</acc>
          <name>string</name>
        </sender>
        <reciver>
          <acc>string</acc>
          <name>string</name>
        </reciver>
        <amount>
          <value>1500</value>
        </amount>
        <dsignature> </dsignature>
     </transaction>
    </sendfund>
  </soap:Body>
</soap:Envelope>

怎么做?我正在使用 xmltransform 即时读取转换,但我不能如何使用它,或者哪个函数将它用于自定义 xml?

【问题讨论】:

  • 你试过select dbms_xmlgen.getxml('your query') xdoc from dual ??
  • 是的,但我不想要结果
  • dbms_xmlgen 将查询结果转换为 xml
  • select dbms_xmlgen.getxml( 'select' || chr(10) || '''0000'' bank_code' || chr(10) || ',''0'' confirm_code' || chr(10) || ',''success'' confirm_message' || chr(10) || ',sysdate trtime_trdatetime' || chr(10) || ',''123456789'' sender_acc' || chr(10) || ',''aaaaaa'' sender_name' || chr(10) || ',''123456789'' reciver_acc' || chr(10) || ',''aaaaaa'' reciver_name' || chr(10) || ',150 amount_value' || chr(10) || ','''' dsignature' || chr(10) || 'from dual') xdoc from dual 我需要自定义固定 XML 模板

标签: xml oracle


【解决方案1】:

如果您还没有注册自己的 xml 架构,最简单的方法是使用带变量的 xmlquery:

select
xmlquery(
      'declare namespace soap = "http://schemas.xmlsoap.org/soap/envelope/"; 
<soap:Envelope>
  <soap:Body>
    <sendfund xmlns="http://blabla.com/">
      <bank>
        <code>{$bank_code}</code>
      </bank>
      <transaction>
        <confirm>
          <code>{$confirm_code}</code>
          <message>{$confirm_message}</message>
        </confirm>
        <trtime>
          <trdatetime>{$trtime_trdatetime} </trdatetime>
        </trtime>
        <sender>
          <acc>{$sender_acc}</acc>
          <name>{$sender_name}</name>
        </sender>
        <reciver>
          <acc>{$reciver_acc}</acc>
          <name>{$reciver_name}</name>
        </reciver>
        <amount>
          <value>{$amount_value}</value>
        </amount>
        <dsignature>{$dsignature}</dsignature>
     </transaction>
    </sendfund>
  </soap:Body>
</soap:Envelope>
      '
      passing         
      bank_code          as "bank_code", 
      confirm_code       as "confirm_code", 
      confirm_message    as "confirm_message", 
      trtime_trdatetime  as "trtime_trdatetime", 
      sender_acc         as "sender_acc", 
      sender_name        as "sender_name", 
      reciver_acc        as "reciver_acc", 
      reciver_name       as "reciver_name", 
      amount_value       as "amount_value", 
      dsignature         as "dsignature"
      returning content
   ) as xdata
from 
   (
    select 
       '0000'        bank_code
       ,'0'          confirm_code
       ,'success'    confirm_message
       ,sysdate      trtime_trdatetime
       ,'123456789'  sender_acc
       ,'aaaaaa'     sender_name
       ,'123456789'  reciver_acc
       ,'aaaaaa'     reciver_name
       ,150          amount_value
       ,''           dsignature
    from dual
    ) t;

另一种更困难但更正确的生成此类文档的方法是使用特殊函数,如 xmlroot、xmlelement、xmlforest:

select
   xmlroot(
      xmlelement(
         "soap:Envelope"
        ,XMLATTRIBUTES('http://blabla.com/' as "xmlns:soap")
        ,xmlelement(
           "soap:Body"
          ,xmlelement(
             "sendfunc"
            ,XMLATTRIBUTES('http://blabla.com/' as "xmlns")
            ,xmlforest(
                xmlelement("code", bank_code) as "bank"
               ,xmlforest(
                    xmlforest(
                       confirm_code as "code",
                       confirm_message as "message"
                    ) as "confirm"
                   ,xmlforest(
                       trtime_trdatetime as "trdatetime"
                    ) as "trtime"
                   ,xmlforest(
                       sender_acc as "acc",
                       sender_name as "name"
                    ) as "sender"
                   ,xmlforest(
                       reciver_acc as "acc",
                       reciver_name as "name"
                    ) as "reciver"
                   ,xmlforest(
                       amount_value as "value"
                    ) as "amount"
                   ,dsignature as "dsignature"
               ) as "transaction"
            )
           )
         )
      )
    , VERSION '1.0'
   ) xdata
from(
  select
    '0000' bank_code
    ,'0'   confirm_code
    ,'success' confirm_message
    ,sysdate trtime_trdatetime
    ,'123456789' sender_acc
    ,'aaaaaa' sender_name
    ,'123456789' reciver_acc
    ,'aaaaaa' reciver_name
    ,150 amount_value
    ,'' dsignature
    from dual
    );

更新:如果您需要以精确的编码导出它,您需要使用 xmlserialize 函数,即只需将上面示例中的准备好的 xmltype 传递给 xmlserialize: 例如xml查询:

select 
   xmlserialize(document xdata as blob encoding 'UTF-8' version '1.0') x_serialized
from (
  select 
     xmlquery(
      'declare namespace soap = "http://schemas.xmlsoap.org/soap/envelope/"; 
<soap:Envelope>
  <soap:Body>
    <sendfund xmlns="http://blabla.com/">
      <bank>
        <code>{$bank_code}</code>
      </bank>
      <transaction>
        <confirm>
          <code>{$confirm_code}</code>
          <message>{$confirm_message}</message>
        </confirm>
        <trtime>
          <trdatetime>{$trtime_trdatetime} </trdatetime>
        </trtime>
        <sender>
          <acc>{$sender_acc}</acc>
          <name>{$sender_name}</name>
        </sender>
        <reciver>
          <acc>{$reciver_acc}</acc>
          <name>{$reciver_name}</name>
        </reciver>
        <amount>
          <value>{$amount_value}</value>
        </amount>
        <dsignature>{$dsignature}</dsignature>
     </transaction>
    </sendfund>
  </soap:Body>
</soap:Envelope>
      '
      passing         
      bank_code          as "bank_code", 
      confirm_code       as "confirm_code", 
      confirm_message    as "confirm_message", 
      trtime_trdatetime  as "trtime_trdatetime", 
      sender_acc         as "sender_acc", 
      sender_name        as "sender_name", 
      reciver_acc        as "reciver_acc", 
      reciver_name       as "reciver_name", 
      amount_value       as "amount_value", 
      dsignature         as "dsignature"
      returning content
   ) as xdata
from 
   (
    select 
       '0000'        bank_code
       ,'0'          confirm_code
       ,'success'    confirm_message
       ,sysdate      trtime_trdatetime
       ,'123456789'  sender_acc
       ,'aaaaaa'     sender_name
       ,'123456789'  reciver_acc
       ,'aaaaaa'     reciver_name
       ,150          amount_value
       ,''           dsignature
    from dual
    ) t
);

XMLROOT/XMLELEMENT/XMLFOREST:

select 
   xmlserialize(document xdata as blob encoding 'UTF-8' version '1.0' indent size=2) x_serialized
from (
select
   xmlroot(
      xmlelement(
         "soap:Envelope"
        ,XMLATTRIBUTES('http://blabla.com/' as "xmlns:soap")
        ,xmlelement(
           "soap:Body"
          ,xmlelement(
             "sendfunc"
            ,XMLATTRIBUTES('http://blabla.com/' as "xmlns")
            ,xmlforest(
                xmlelement("code", bank_code) as "bank"
               ,xmlforest(
                    xmlforest(
                       confirm_code as "code",
                       confirm_message as "message"
                    ) as "confirm"
                   ,xmlforest(
                       trtime_trdatetime as "trdatetime"
                    ) as "trtime"
                   ,xmlforest(
                       sender_acc as "acc",
                       sender_name as "name"
                    ) as "sender"
                   ,xmlforest(
                       reciver_acc as "acc",
                       reciver_name as "name"
                    ) as "reciver"
                   ,xmlforest(
                       amount_value as "value"
                    ) as "amount"
                   ,dsignature as "dsignature"
               ) as "transaction"
            )
           )
         )
      )
    , VERSION '1.0'
   ) xdata
from(
  select
    '0000' bank_code
    ,'0'   confirm_code
    ,'success' confirm_message
    ,sysdate trtime_trdatetime
    ,'123456789' sender_acc
    ,'aaaaaa' sender_name
    ,'123456789' reciver_acc
    ,'aaaaaa' reciver_name
    ,150 amount_value
    ,'' dsignature
    from dual
    )
);

【讨论】:

  • big 10x 如何添加这一行 '
  • @GoodBit 编码是文本导出的特殊参数,如果要将 xmltype 导出为文本,则需要将返回的 xmltype 包装到 xmlserialize 函数中。一分钟,我也会用它来更新我的答案
  • @GoodBit 我已经用 xmlserialize 将答案更新为所需的编码
  • 只是小问题如何像这样格式化xml? &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;soap:Envelope xmlns:soap="http://blabla.com/"&gt; &lt;soap:Body&gt; &lt;sendfunc xmlns="http://blabla.com/"&gt; &lt;bank&gt; &lt;code&gt;0000&lt;/code&gt; &lt;/bank&gt; &lt;transaction&gt; &lt;confirm&gt; &lt;code&gt;0&lt;/code&gt; &lt;message&gt;success&lt;/message&gt; &lt;/confirm&gt;
  • 你检查过我上面的最后一个例子了吗?
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多