RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 931984
Accepted
Андрей NOP
Андрей NOP
Asked:2020-01-14 20:36:12 +0000 UTC2020-01-14 20:36:12 +0000 UTC 2020-01-14 20:36:12 +0000 UTC

如何循环遍历 XML 元素?

  • 772

Oracle Database 11g 企业版 11.2.0.4.0 - 64 位生产

有一个巨大的 XML,您需要在服务器端从中取出一些数据。我将 XML 加载到 XmlType 并使用 XPath 获取必要的数据。例如:

declare
  xml XmlType;
begin
  xml := XmlType('
<xml>
  <a>
    <b>0</b>
    <c>1</c>
    <d>
      <e>2</e>
      <e>3</e>
      <e>4</e>
    </d>
    <d>
      <e>5</e>
      <e>6</e>
      <e>7</e>
    </d>
    <d>
      <e>8</e>
      <e>9</e>
    </d>
  </a>
</xml>');
  :r0 := xml.extract('//xml/a/b/text()').getStringVal();
  :r1 := xml.extract('//xml/a/c/text()').getStringVal();
  :r2 := xml.extract('//xml/a/d[1]/e[1]/text()').getStringVal();
end;

单个元素没有问题,它们通常被提取,​​但是重复的呢?如上面的示例,我有一个未知数量的元素d,每个元素都包含未知数量的元素e,我需要依次提取每个元素并在其上执行一些服务器方法。

我可以通过索引访问,但我不知道如何获取这些元素的数量,我知道 XPath 有一个内置函数count,但我不明白如何使用它以及我的数据库是否支持它。

尝试调用类似这样xml.extract('count(//xml/a/d)')的内容会导致消息“不支持指定的 XPATH 表达式”。

访问不存在的索引时,发生异常SELF_IS_NULL,您可以以某种方式使用它吗?虽然,当然,我不想在异常上建立逻辑......

xml
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mike
    2020-01-14T21:38:50Z2020-01-14T21:38:50Z

    您可以使用XMLSequence或XMLTable 函数。例如,您可以e使用以下查询从文档中获取单独行中的所有值:

    select extractvalue(value(E),'e')
      from table(XMLSequence(extract(xml, '//e'))) E
    

    此外,您可以通过选择单个 d 元素,然后从中获取一些值,将 xml 扩展为关系表来进行多个级别。相同的一组值是这样获得的:

    select value(D).getStringVal() d_text, extractvalue(value(E),'e') e
      from table(XMLSequence(extract(xml, '//d'))) D,
           table(XMLSequence(extract(value(D), '//e'))) E
    

    在这种情况下,我们得到了元素d,我们可以将元素作为一个整体来看待,或者选择这个特定节点的一些其他特定值。此外,通过向 from 添加一个 xmlsequence 来扩展所选节点的元素。

    如果您想在过程中使用它,那么您可以编写例如:

    FOR node IN (select value(D) d from table(XMLSequence(extract(xml, '//d'))) D) LOOP
        что то делаем с node.D
    END LOOP;
    

    我还在互联网上找到了以下程序样式的构造:

    declare
      xml XMLType := XMLType('<b><a>1</a><a>2</a><a>3</a><a>1</a><a>2</a><a>3</a>'||
       '<a>1</a><a>2</a><a>3</a><a>1</a><a>2</a><a>3</a><a>1</a><a>2</a><a>3</a></b>');
      x dbms_xmldom.DOMNodeList;
      node dbms_xmldom.DOMNode;
      value varchar2(32000);
      i pls_integer;
    begin
      x := dbms_xmldom.getChildNodes(dbms_xmldom.getNodeFromFragment(xml.extract('//a')));
      for i in 0..dbms_xmldom.getLength(x)-1 loop
        node := dbms_xmldom.getFirstChild(dbms_xmldom.item(x, i));
        value := dbms_xmldom.getNodeValue(node);
      end loop;
    end;
    

    他们写道,它比解析请求更快。取自 sql.ru 的示例

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5