【问题标题】:Check values in XML检查 XML 中的值
【发布时间】:2011-08-15 04:15:46
【问题描述】:

我有变量

LRowNode DBMS_XMLDOM.DOMNode;

包含(示例)

<N_4883636>
  <TID_23787542>12</TID_23787542>
  <TID_23787543></TID_23787543>
  <TID_23787532/>
  <TID_23787533>0</TID_23787533>
  <TID_23787534/>
  <TID_23787535/>
  <TID_23787536>10</TID_23787536>
  <TID_23787537/>
  <TID_23787538/>
  <TID_23787539>0</TID_23787539>
  <TID_23787540>0</TID_23787540>
  <TID_23787541>0</TID_23787541>
</N_4883636>

<N_4883636>
  <TID_23787542>0</TID_23787542>
  <TID_23787543></TID_23787543>
  <TID_23787532/>
  <TID_23787533>0</TID_23787533>
  <TID_23787534/>
  <TID_23787535/>
  <TID_23787536>0</TID_23787536>
  <TID_23787537/>
  <TID_23787538/>
  <TID_23787539>0</TID_23787539>
  <TID_23787540>0</TID_23787540>
  <TID_23787541>0</TID_23787541>
</N_4883636>

如何检查至少一个非空且不为空

【问题讨论】:

    标签: xml oracle xslt xpath plsql


    【解决方案1】:

    这只是一个基本示例,可能不适合您,但应该让您了解如何使用 DBMS_XMLDOM。

    另一种选择是使用 DBMS_XMLDOM.GETXMLTYPE 来更改游戏规则,使用所有这些 XMLTYPE 好东西。

    create or replace function has_data (p_node in dbms_xmldom.domnode)
    return boolean as
      subnodes dbms_xmldom.domnodelist;
      node dbms_xmldom.domnode;
      strval varchar2(32767);
      val number;
    begin
      subnodes := dbms_xmldom.getchildnodes(p_node);
    
      dbms_output.put_line('number of subnodes: ' || dbms_xmldom.getlength(subnodes));
    
      for i in 0 .. dbms_xmldom.getlength(subnodes) - 1 loop
        node := dbms_xmldom.item(subnodes, i);
        strval := dbms_xmldom.getnodevalue(dbms_xmldom.getfirstchild(node));
        dbms_output.put_line(
          '(' || i || ') ' ||
          dbms_xmldom.gettagname(dbms_xmldom.makeelement(node)) ||
          ' = ' || strval
        );
    
        if strval is not null then
          val := to_number(strval);
          if val > 0 then
            dbms_output.put_line('Node has data.');
            return true;
          end if;
        end if;
    
      end loop;
    
      dbms_output.put_line('Node has no data.');
      return false;
    end;
    /
    show errors
    
    declare
      dataset1 constant varchar2(32767) :=
    '<N_4883636>
      <TID_23787542>12</TID_23787542>
      <TID_23787543></TID_23787543>
      <TID_23787532/>
      <TID_23787533>0</TID_23787533>
      <TID_23787534/>
      <TID_23787535/>
      <TID_23787536>10</TID_23787536>
      <TID_23787537/>
      <TID_23787538/>
      <TID_23787539>0</TID_23787539>
      <TID_23787540>0</TID_23787540>
      <TID_23787541>0</TID_23787541>
    </N_4883636>';
    
      dataset2 constant varchar2(32767) :=
    '<N_4883636>
      <TID_23787542>0</TID_23787542>
      <TID_23787543></TID_23787543>
      <TID_23787532/>
      <TID_23787533>0</TID_23787533>
      <TID_23787534/>
      <TID_23787535/>
      <TID_23787536>0</TID_23787536>
      <TID_23787537/>
      <TID_23787538/>
      <TID_23787539>0</TID_23787539>
      <TID_23787540>0</TID_23787540>
      <TID_23787541>0</TID_23787541>
    </N_4883636>';
    
      dataset3 constant varchar2(32767) :=
    '<N_4883636>
      <TID_23787542>0</TID_23787542>
      <TID_23787543>0</TID_23787543>
      <TID_23787533>3</TID_23787533>
    </N_4883636>';
    
      doc dbms_xmldom.domdocument;
      nodes dbms_xmldom.domnodelist;
      x boolean;
    begin
      doc := dbms_xmldom.newdomdocument(dataset1);
      nodes := dbms_xmldom.getelementsbytagname(doc, 'N_4883636');
      x := has_data(dbms_xmldom.item(nodes, 0));
    
      doc := dbms_xmldom.newdomdocument(dataset2);
      nodes := dbms_xmldom.getelementsbytagname(doc, 'N_4883636');
      x := has_data(dbms_xmldom.item(nodes, 0));
    
      doc := dbms_xmldom.newdomdocument(dataset3);
      nodes := dbms_xmldom.getelementsbytagname(doc, 'N_4883636');
      x := has_data(dbms_xmldom.item(nodes, 0));
    end;
    /
    

    【讨论】:

      【解决方案2】:
      LNonEmptyIndexes := DBMS_XSLPROCESSOR.SELECTNODES(LRowNode, './*[text()!=''0'']');
      nNON_EMPTY_COUNT := DBMS_XMLDOM.getLength(LNonEmptyIndexes);
      IF (nNON_EMPTY_COUNT != 0) THEN
      ...
      END IF;
      

      【讨论】:

        猜你喜欢
        • 2020-08-07
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2014-10-29
        相关资源
        最近更新 更多