【问题标题】:PL/SQL: Count number of nodes in xmlPL/SQL:计算 xml 中的节点数
【发布时间】:2011-11-07 16:20:45
【问题描述】:

我正在与 Oracle 合作。

有没有办法使用 PL/SQL 计算 XML 文件中节点(包括后代)的数量?

我希望能够将结果保存为变量以用作循环迭代器的上限。

我有以下xml,我想统计行节点内的节点数:

<row>
  <date name="date1" id="101"></date>
  <element1 name="ele1" id="111">
    <stuff></stuff>
    <stuff></stuff>
    <stuff></stuff>
  </element1>
  <element2 name="ele2" id="121"></element2>
  <element3 name="ele3" id="131></element15>
</row>

结果应该是 7。

@johnbk 我正在与 Oracle 合作

这里的想法是,在我获得节点数后,我可以在其中使用它:

nodeCount := 1;
    FOR i IN 1 .. numNodes
    LOOP
        xpath1 := '/row/*[' || nodeCount || ']/@name';
        SELECT EXTRACT(form_xml, xpath1) as other_name;
        nodeCount := nodeCount +1;
    END LOOP;

感谢您的帮助。

【问题讨论】:

  • 您正在处理哪个数据库?
  • @johnbk 我正在使用 Oracle

标签: xml plsql count nodes


【解决方案1】:

您可以尝试使用dbms_xmldom

DECLARE
  l_doc  dbms_xmldom.DOMDocument;
  l_list dbms_xmldom.DOMNodeList;
  l_clob clob;
BEGIN
  l_doc:=dbms_xmldom.newdomdocument(form_xml);
l_list:=dbms_xmldom.getChildNodes(dbms_xmldom.getFirstChild(dbms_xmldom.MakeNode(l_doc)));
  dbms_output.put_line('length='||dbms_xmldom.getLength(l_list));
  dbms_lob.freetemporary(l_clob);
END;

根据您的 Oracle 版本,包含超过 64K 节点的 XML 可能会出现问题 - 请参阅 https://forums.oracle.com/forums/thread.jspa?threadID=614453

【讨论】:

    【解决方案2】:

    我希望能够将结果保存为一个变量,用作循环迭代器的上限。

    我猜这和你的另一个question有关?

    您不需要知道节点的数量,因为您不必自己显式循环 xml。您可能正试图以次优方式解决您的实际问题。

    下面是如何使用XMLQUERY找到您要查找的号码:

    declare
      v_data constant xmltype := xmltype('<row>
      <date name="date1" id="101"></date>
      <element1 name="ele1" id="111">
        <stuff></stuff>
        <stuff></stuff>
        <stuff></stuff>
      </element1>
      <element2 name="ele2" id="121"></element2>
      <element3 name="ele3" id="131"></element3>
      </row>');
      v_count xmltype;
    begin
      select xmlquery('count($doc/row/descendant::*)'
              passing v_data as "doc"
              returning content)
        into v_count from dual;
      dbms_output.put_line('count = ' || v_count.getstringval);
    end;
    /
    

    【讨论】:

    • 只是好奇,所以我可以更好地理解语言,如果我必须查询以获取 v_data 并且无法“声明”它,你会怎么做?它来自从数据库中获取信息的查询。你会选择 table.data INTO v_data 吗?
    • @quotemyname:这是一种选择,但您也可以直接从数据库表中获取 XML 数据。这会从表so11txmldata 获取XML 数据,其中so11t.id = 1select xmlquery('count($doc/row/descendant::*)' passing t.xmldata as "doc" returning content) into v_count from so11t t where id = 1;
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多