如何选择与 PLSQL 中的值匹配的子 XML?

Posted

技术标签:

【中文标题】如何选择与 PLSQL 中的值匹配的子 XML?【英文标题】:How to select a sub XML that matches a value in PLSQL? 【发布时间】:2015-07-03 04:52:40 【问题描述】:

我有一些类似的 XML

<?xml version="1.0" encoding="utf-8"?> 
<response>   
  <HEADER>some content</HEADER>  
  <employee><name>A</name><age>32</age><type>Permanent</type></employee>
  <employee><name>B</name><age>34</age><type>Temporary</type></employee>
  <employee><name>C</name><age>63</age><type>Temporary</type></employee>
  <employee><name>D</name><age>64</age><type>Permanent</type></employee>
  <employee><name>E</name><age>54</age><type>Permanent</type></employee>
  <company><cname>Company A</cname></company>   
  <company><cname>Company B</cname></company>   
  <company><cname>Company C</cname></company>
</response>

我只想要“永久”员工详细信息和标题作为输出。类似的,

<?xml version="1.0" encoding="utf-8"?>
<response>
  <HEADER>some content</HEADER>
  <employee><name>A</name><age>32</age><type>Permanent</type></employee>
  <employee><name>D</name><age>64</age><type>Permanent</type></employee>
  <employee><name>E</name><age>54</age><type>Permanent</type></employee>
</response>

有没有办法使用 PL/SQL 获得这种类型的输出?

提前致谢。

【问题讨论】:

你打算用 PL/SQL 中的那个 o/p 做什么?我的意思是将它存储在数据库中还是什么?我不认为这不是 PL/SQL 的目的。这种处理通常用 Java 等语言完成。 【参考方案1】:
declare 
v_xml xmltype := xmltype('<response>   
  <HEADER>some content</HEADER>  
  <employee><name>A</name><age>32</age><type>Permanent</type></employee>
  <employee><name>B</name><age>34</age><type>Temporary</type></employee>
  <employee><name>C</name><age>63</age><type>Temporary</type></employee>
  <employee><name>D</name><age>64</age><type>Permanent</type></employee>
  <employee><name>E</name><age>54</age><type>Permanent</type></employee>
  <company><cname>Company A</cname></company>   
  <company><cname>Company B</cname></company>   
  <company><cname>Company C</cname></company>
</response>');

begin 
dbms_output.put_line('1) Extract only Permanent employee.');
dbms_output.put_line(v_xml.extract('//response/employee[type !="Permanent"]').getClobVal());
dbms_output.put_line('  ');
dbms_output.put_line('2) Remove unnecessary node.');
dbms_output.put_line( v_xml.deleteXML('//response/employee[type !="Permanent"]').deleteXML('//response/company').getStringVal());
end;

【讨论】:

【参考方案2】:

要仅提取永久雇员,您可以使用这个简单的选择:

SELECT
  xml_tab.*
FROM
  XMLTABLE(
    '/response/employee' PASSING XMLTYPE(q'#<?xml version="1.0" encoding="utf-8"?> 
        <response>   
          <HEADER>some content</HEADER>  
          <employee><name>A</name><age>32</age><type>Permanent</type></employee>
          <employee><name>B</name><age>34</age><type>Temporary</type></employee>
          <employee><name>C</name><age>63</age><type>Temporary</type></employee>
          <employee><name>D</name><age>64</age><type>Permanent</type></employee>
          <employee><name>E</name><age>54</age><type>Permanent</type></employee>
          <company><cname>Company A</cname></company>   
          <company><cname>Company B</cname></company>   
          <company><cname>Company C</cname></company>
        </response>#')
    COLUMNS 
    i FOR ORDINALITY
    ,name VARCHAR2(100) PATH 'name'
    ,age VARCHAR2(3) PATH 'age'
    ,type VARCHAR2(100) PATH 'type'
  ) xml_tab
WHERE
  xml_tab.type = 'Permanent';

这会产生以下输出:

I |NAME|AGE | TYPE
---------------------
1 | A  | 32 | Permanent
4 | D  | 64 | Permanent
5 | E  | 54 | Permanent

【讨论】:

以上是关于如何选择与 PLSQL 中的值匹配的子 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配MongoDB中的子文档数组?

尝试循环通过 XML 提取 PLSQL 中的值

在 xpath 中使用 [not] 检索与给定值不匹配的内容 (PLSQL)

如何匹配plsql中正则表达式中的列表/数组?

如何使用熊猫对与给定条件匹配的列中的值求和?

更改具有与特定正则表达式模式匹配的标记的 xml 树中的值