使用 oracle 解析器从 XML 中获取首次出现的值

2024-01-04

我不是 Oracle 专家,但根据要求,我使用 Oracle Parser 来解析 Xml。对于下面列出的 xml,即

<?xml version="1.0" encoding="iso-8859-1" ?>
<SearchOutput>
<rowArray>
    <Row>
        <cellArray>
            <Cell>
                <columnId>1</columnId>
                <valueArray>
                    <Value>
                        <value>IR000024575453</value>
                    </Value>
                </valueArray>
            </Cell>
            <Cell>
                <columnId>5</columnId>
                <valueArray>
                    <Value>
                        <value>AZ12604823-001</value>
                    </Value>
                </valueArray>
            </Cell>
            <Cell>
                <columnId>2</columnId>
                <valueArray>
                    <Value>
                        <value>IT06686</value>
                    </Value>
                </valueArray>
            </Cell>
            <Cell>
                <columnId>9</columnId>
                <valueArray>
                    <Value>
                        <value>Hu Mics Metab K</value>
                    </Value>
                </valueArray>
            </Cell>
            <Cell>
                <columnId>8</columnId>
                <valueArray>
                    <Value>
                        <value>2006-06-21</value>
                    </Value>
                </valueArray>
            </Cell>
            <Cell>
                <columnId>7</columnId>
                <valueArray>
                    <Value>
                        <value>2006-07-27</value>
                    </Value>
                </valueArray>
            </Cell>
        </cellArray>
    </Row>
</rowArray>
</SearchOutput>

我已经使用了该方法,其中 l_xmlclob 具有 CLOB 数据类型并在上面分配了 xml。

FOR r IN (  SELECT rownum rn, cells
           FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob)
                                     columns CELLS  XMLTYPE PATH './cellArray')
        )
 LOOP
  DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);      

  FOR c IN ( SELECT colid, colval
               FROM xmltable('/cellArray/Cell' passing r.cells
                                               columns COLID NUMBER PATH './columnId',
                                                       COLVAL VARCHAR(20) PATH     './valueArray/Value/value')
           )
  LOOP
     DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval);
  END LOOP;
 END LOOP;

它工作正常,它的输出就像

Row: 1
colid, col value: 1, IR000024575453
colid, col value: 5, AZ12604823-001
colid, col value: 2, IT06686
colid, col value: 9, Hu Mics Metab K
colid, col value: 8, 2006-06-21
colid, col value: 7, 2006-07-27

但是如果 xml 中有一个接一个的两个值,并且我只想选择第一个出现的值,即对于下面的 xml,就会出现问题

<?xml version="1.0" encoding="iso-8859-1" ?>
<SearchOutput>
<rowArray>
<Row>
    <cellArray>
        <Cell>
            <columnId>1</columnId>
            <valueArray>
                <Value>
                    <value>Uganda</value>
                </Value>
                <Value>
                    <value>Italy</value>
                </Value>
            </valueArray>
        </Cell>
        <Cell>
            <columnId>5</columnId>
            <valueArray>
                <Value>
                    <value>AZ12604823-001</value>
                </Value>
            </valueArray>
        </Cell>
        <Cell>
            <columnId>2</columnId>
            <valueArray>
                <Value>
                    <value>IT06686</value>
                </Value>
            </valueArray>
        </Cell>
        <Cell>
            <columnId>9</columnId>
            <valueArray>
                <Value>
                    <value>Hu Mics Metab K</value>
                </Value>
            </valueArray>
        </Cell>
        <Cell>
            <columnId>8</columnId>
            <valueArray>
                <Value>
                    <value>2006-06-21</value>
                </Value>
            </valueArray>
        </Cell>
        <Cell>
            <columnId>7</columnId>
            <valueArray>
                <Value>
                    <value>2006-07-27</value>
                </Value>
                <Value>
                    <value>2012-02-27</value>
                </Value>
            </valueArray>
        </Cell>
    </cellArray>
</Row>
</rowArray>
</SearchOutput>

我希望仅在该 valueArray 中选择“乌干达,AZ12604823-001,IT06686,Hu Mics Metab K,2006-06-21,2006-07-27”而不是“意大利和 2012-02-27”。但不知道如何修改现有的代码。


我想这就是你正在寻找的 -

FOR r IN (  SELECT rownum rn, cells
           FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob)
                                     columns CELLS  XMLTYPE PATH './cellArray') f
        )
 LOOP
  DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);      
  FOR c IN ( SELECT colid, 
                    colval
               FROM xmltable('for $i in /cellArray/Cell
                              return $i' 
                              passing r.cells
                              columns COLID NUMBER PATH 'columnId',
                                      COLVAL VARCHAR(20) PATH 'valueArray/Value[1]/value')                  
           )
  LOOP
     DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval);
  END LOOP;
 END LOOP;
end;

OR

FOR r IN (  SELECT rownum rn, cells
           FROM xmltable('/SearchOutput/rowArray/Row' passing XMLTYPE(l_xmlclob)
                                     columns CELLS  XMLTYPE PATH './cellArray')
        )
 LOOP
  DBMS_OUTPUT.PUT_LINE('Row: '||r.rn);      

  FOR c IN ( SELECT colid, colval
               FROM xmltable('/cellArray/Cell' passing r.cells
                                               columns COLID NUMBER PATH './columnId',
                                                       COLVAL VARCHAR(20) PATH     './valueArray/Value[1]/value')
           )
  LOOP
     DBMS_OUTPUT.PUT_LINE('colid, col value: '||c.colid||', '||c.colval);
  END LOOP;
 END LOOP;

Output-

Row: 1
colid, col value: 1, Uganda
colid, col value: 5, AZ12604823-001
colid, col value: 2, IT06686
colid, col value: 9, Hu Mics Metab K
colid, col value: 8, 2006-06-21
colid, col value: 7, 2006-07-27

Value[1]会给你第一个多行元素,即第一个Value单例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 oracle 解析器从 XML 中获取首次出现的值 的相关文章

随机推荐

  • 如何使用 C# 的 ANTLR 获取 Lexer 和 Parser?

    似乎 ANTLR 支持 C 语言 但我不知道如何生成相关类 我搜索并看到存在 Visual Studio 扩展 但我不支持 2015 那么如何使用 ANTLR 手动为 C 生成词法分析器和解析器 VS 扩展主要用于语法突出显示和编辑器细节
  • jQuery UI 选项卡 - IE 中的圆角选项卡角

    我正在尝试从 AjaxControlToolkit 切换到 jQuery UI 选项卡以获得相当简单的选项卡元素 我 99 都掌握了 CSS 和主题 但我在尝试在 IE 中的选项卡上实现圆角时遇到了困难 jQuery UI 提供了更好的浏览
  • reinterpret_cast 类型双关实际上是未定义的行为吗?

    这种类型的双关语似乎被广泛持有reinterpret cast以某种方式被禁止 正确地说 未定义的行为 即 本国际标准没有提出要求的行为 https timsong cpp github io cppwp n4659 defns undef
  • TFS 传输层安全 1.1/1.2

    我们目前在 Windows Server 2012 R2 上使用 TFS 2015 3 使用 NARTAC 指定使用 TLS1 1 1 2 并禁用 TLS1 0 后 我们的构建层服务器无法连接到应用层服务器 有没有人有同样的问题并解决了 谢
  • 语义相关性算法 - python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想找到两个同义词集之间的相关性 我遇到了许多算法 如 resnik lin wu palmer path 算法 leacock ch
  • 从 iPhone 上传文件时出现 POSIX 错误 12(“无法分配内存”)

    我正在开发一个 iPhone 应用程序 该应用程序涉及将相机中的完整照片 通常每张照片在 1 5 到 2 0 MB 之间 及其缩略图 小得多 上传到 Amazon S3 缩略图总是成功上传 但是有时完整图像则不然 当它们失败时 它们会失败并
  • Botframework - 调整机器人聊天的宽度[重复]

    这个问题在这里已经有答案了 Is it possible to resize the width of the chat for botframework Currently I m testing on a emulator Basica
  • 使用 Node JS 将数据从 Excel 导入到 MySql

    我想使用 NodeJS 读取 excel 并保存在 MySQL 数据库中 我不知道该使用什么库 我希望能够根据某些行和列读取 Excel 请帮我 您可以使用许多库 sheetjs xlsx excel js etc
  • iOS 的滑块视图

    Can someone help me with this scenario 有一个按钮 点击该按钮时 会滑动打开一个 UIView 点击的按钮仍在其左侧 再次点击此按钮时 使 UIView 向后滑动 你所描述的很简单 我们将从右侧滑入的视
  • RGB 图像的像素强度以及如何将其与整数相乘以查看灰度阴影

    我有一个 RGB 图像 有 4 种不同的颜色黑色 0 0 0 作为背景 绿色 106 136 93 蓝色 64 224 208 和棕色 168 124 85 当我将图像读取为灰度并使用 np unique 时 它会返回一个巨大的像素强度列表
  • 使用异步承诺处理 Guzzle 超时

    我正在发送多个异步承诺 并将 guzzle 超时设置为 30 我想知道如何捕获是否有任何承诺超时 以便我可以报告此错误 请参阅下面的代码 本质上 我想在超时之前使用我能做的任何响应 并捕获那些超时的响应 foreach apiRequest
  • 为什么在生产环境中运行 Go 应用程序时建议使用“go build”而不是“go run”?

    我有一个 Dockerfile 用来编译 Go 应用程序go build 我研究了一下 确实go build推荐用于生产 但是我无法找到正确的答案 我明白go run创建一个临时文件 并在应用程序终止时进行清理 但是如果我使用Docker
  • 从另一个线程调用 CFRunLoopStop 是否安全?

    我的 主要是 POSIX 应用程序的 Mac 版本生成一个子线程 该子线程调用 CFRunLoopRun 来执行事件循环 以从 MacOS 获取网络配置更改事件 当需要收拾东西离开时 主线程在子线程的运行循环上调用 CFRunLoopSto
  • 如何从 JSF 生成 JSON 响应?

    我创建了一个页面 我想在其中从 JSF 页面获取 JSON 响应 但是当我尝试获取页面时 它显示了整个 html 页面 value 21 name Mick Jagger value 43 name Johnny Storm value 4
  • 图数据库(neo4j)与关系数据库。需要设计帮助

    我必须与一个开源项目合作 biojava http biojava org wiki Main Page 但我对某些性能不满意 我想花一些时间来改进它 例如 我有一个以这种方式编码的文本数据库 chrX Cufflinks exon 651
  • 如何在Project中找到UIWebView并替换为WKWebView?

    我们收到这封电子邮件来自 电子邮件受保护 cdn cgi l email protection上传构建时 我们发现您的应用程序 应用程序名称 1 0 5 0 最近交付存在一个或多个问题 请更正以下问题 然后重新上传 ITMS 90809 已
  • 如何更改另一个程序图标?

    我如何在 C 中更改另一个程序图标 不是我的 我想在 Windows 上执行此操作 我的一个朋友正在用 VB 编程 他制作了一个可以更改另一个 exe 图标的程序 那么我怎样才能在 C 中做到这一点呢 准备好更新的资源后 使用 LoadIc
  • 如何将 Pandas DataFrame 更改为多列列?

    我有一个 Pandas DataFrame 其列索引如下所示 A1 A2 A3 B1 B2 B3 the data 我想做的就是将此 DataFrame 的列索引更改为多索引列索引 如下面的格式所示 而不修改数据 只是简单地在索引中添加上一
  • 将 XML 中的 反序列化为 List<>

    我在反序列化 WCF Web 服务的结果时遇到问题 该方法返回一个List
  • 使用 oracle 解析器从 XML 中获取首次出现的值

    我不是 Oracle 专家 但根据要求 我使用 Oracle Parser 来解析 Xml 对于下面列出的 xml 即