如何将xmltype的唯一分支作为varchar?

时间:2016-02-10 14:09:27

标签: sql xml database oracle

Oracle 11g2。 例如:

select XMLType( 
'<main>
  <article> 
    <title>1.txt</title>
      <type>market</type>
      <author>
        <name>J. Smith</name>   
        <age>32</age>
      </author>
  </article>
  <comment>For information</comment>
</main>').getStringVal() from dual;

你能帮我修改一下这个select语句吗? 我想将 varchar 输出为:

<title>1.txt</title>
<type>market</type>
<author>
  <name>J. Smith</name>   
  <age>32</age>
</author>

不幸的是,使用extract(&#39; / main / article&#39;)作为:

select XMLType( 
'<main>
  <article> 
    <title>1.txt</title>
      <type>market</type>
      <author>
        <name>J. Smith</name>   
        <age>32</age>
      </author>
  </article>
  <comment>For information</comment>
</main>').extract('/main/article').getStringVal() from dual;

丢失文本格式(一行中的所有输出)。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以通过XMLTABLE和XMLSERIALISE执行此操作(包括文章节点)以进行漂亮的打印,例如:

<强>查询

with sample_data as (select XMLType( 
'<main>
  <article> 
    <title>1.txt</title>
      <type>market</type>
      <author>
        <name>J. Smith</name>   
        <age>32</age>
      </author>
  </article>
  <comment>For information</comment>
</main>') xdata from dual)
select xmlserialize(document x.col1 as varchar2(4000) indent size = 2)
from   sample_data sd
       cross join xmltable('/main/article'
                           passing sd.xdata
                           columns col1 xmltype path '.') x;

<强>结果

<article>
  <title>1.txt</title>
  <type>market</type>
  <author>
    <name>J. Smith</name>
    <age>32</age>
  </author>
</article>

答案 1 :(得分:1)

由于@Boneist显示您可以使用xmlserialize()进行格式化,但由于您的文档中似乎只有一个文章节点,您仍然可以使用extract()

select xmlserialize(document XMLType( 
'<main>
  <article> 
    <title>1.txt</title>
      <type>market</type>
      <author>
        <name>J. Smith</name>   
        <age>32</age>
      </author>
  </article>
  <comment>For information</comment>
</main>').extract('/main/article')
  as varchar2(200) indent) as article
from dual;

或者您可以使用XMLQuery:

select xmlserialize(document xmlquery('/main/article'
  passing XMLType( 
'<main>
  <article> 
    <title>1.txt</title>
      <type>market</type>
      <author>
        <name>J. Smith</name>   
        <age>32</age>
      </author>
  </article>
  <comment>For information</comment>
</main>')
  returning content)
  as varchar2(200) indent) as article
from dual;

ARTICLE                                                                        
--------------------------------------------------------------------------------
<article>                                                                       
  <title>1.txt</title>                                                          
  <type>market</type>                                                           
  <author>                                                                      
    <name>J. Smith</name>                                                       
    <age>32</age>                                                               
  </author>                                                                     
</article>