0

我目前在使用 PL/SQL 解析一些 XML 时遇到问题。本质上,我有一些 XML 存储在现有函数提供的 clob 变量中。我创建了一个新的 xmltype 变量,用于将 clob 转换为 xmltype。然后我循环遍历这个新的 xmltype 变量的内容,试图提取每个标签的内容并将其输出到自己的 div 中。然而,我的代码目前只是将所有标签的内容输出到一个 div 中,这给人的印象是它根本没有循环。

XML 结构是(显然嵌套了更多的内部标签作为回报):

 <?xml version="1.0" encoding="UTF-8"?>
    <results>
       <return>
          <createDate> Date 1 Here </createDate>
          <description> Description 1 here </description>
       </return>
       <return>
          <createDate> Date 2 Here </createDate>
          <description> Description 2 here </description>
       </return>
    </results>

我用来循环的PLSQL可以在这里找到:

    -- parsing : Parse the xml and wrap description content in a html div
        l_html_build := '<!DOCTYPE html><html><head></head><body>';
        l_parse_xml := (xmltype(l_xml_response));
        l_parse_xml_index := 1;
  while l_parse_xml.existsNode('//description[' || To_Char(l_parse_xml_index) || ']') > 0 
     loop
        l_html_build := l_html_build || '<div class="description">';
        l_html_build := l_html_build || (xmltype(l_xml_response).extract('//description[' || To_Char(l_parse_xml_index) 
        || ']/text()').getclobval());
        l_html_build := l_html_build || '</div>';
        l_html_build := replace(l_html_build,'&lt;','<');
        l_html_build := replace(l_html_build,'&gt;','>');
        l_html_build := replace(l_html_build,'&amp;lt;','');
        l_html_build := replace(l_html_build,'&amp;gt;','');
        l_html_build := replace(l_html_build,'&amp;nbsp;','&nbsp;');
        l_html_build := l_html_build ||'</body></html>';
        l_parse_xml_index := l_parse_xml_index + 1; 
     end loop;  

一些参数和变量的解释可以在下面找到:

    l_xml_response     clob;  -- XML from another function is stored here
    l_html_build        clob; -- Used as a variable to store the output to be sent to the page
    l_parse_xml        xmltype; -- l_xml_response content is passed into this xmltype variable which is used for parsing
    l_parse_xml_index  number; -- Used as an index to assist with looping through the tags

输出如下:

 <div class = "description">
  Description 1 here Description 2 here
 </div> 

什么时候应该:

 <div class = "description">
  Description 1 here
 </div> 
 <div class = "description">
  Description 2 here
 </div> 

任何帮助都将不胜感激,因为我是一个 html/css/php/javascript 程序员,而且我以前没有真正做过 PL/SQL(而且我的老板并没有真正提供任何没有帮助的真正培训) .

提前致谢!

4

2 回答 2

1

这似乎比 jme1988 的解决方案效率高出大约一个数量级 - 至少在具有约 1000return条记录的玩具示例上。显然我不能说这种方法将如何扩展到您将使用的数据量(但是,它应该可以很好地扩展)。

DECLARE
   l_c CLOB;
BEGIN
   l_html_build   := '<!DOCTYPE html><html><head></head><body>';
   l_parse_xml    := xmltype(l_xml_response);
   --
   BEGIN
      WITH xdata AS
         (
            SELECT xmltype ( l_xml_response )   xml
              from dual
         )
    SELECT XMLSERIALIZE ( CONTENT extract(xml, '//description') )  x
      INTO l_c
      FROM xdata
         ;
   END;
   l_html_build := l_html_build || l_c;
   --
   l_html_build := replace(l_html_build,'<description', '<div class="description"');
   l_html_build := replace(l_html_build,'</description>', '</div>');
   l_html_build := replace(l_html_build,'&amp;lt;','&lt;');
   l_html_build := replace(l_html_build,'&amp;gt;','&gt;');
   l_html_build := replace(l_html_build,'&amp;nbsp;','&nbsp;');
   l_html_build := l_html_build ||'</body></html>';
END;

希望这些东西能满足你的需求。问候,卡斯滕

于 2013-02-08T16:03:36.697 回答
0

A_horse_with_no_name 的建议是正确的,但是更有效的方法是:

     begin
          for value_set_rec in 
            (select extract(value(x),'/description/text()').getclobval() l_description
                 from table(xmlsequence(xmltype(l_xml_response).extract('//description')))x) 
            loop
              l_html_build := l_html_build || '<div class="description">';
              l_html_build := l_html_build || value_set_rec.l_description;
              l_html_build := l_html_build || '</div>';     
            end loop;

            exception
                when others then
                     --Error handling here
      end;    

        l_html_build := replace(l_html_build,'&lt;','<');
        l_html_build := replace(l_html_build,'&gt;','>');
        l_html_build := replace(l_html_build,'&amp;lt;','');
        l_html_build := replace(l_html_build,'&amp;gt;','');
        l_html_build := replace(l_html_build,'&amp;nbsp;','&nbsp;');
        l_html_build := l_html_build ||'</body></html>';
于 2013-02-08T15:18:30.127 回答