【问题标题】:How to find list of all elements&attributes in a xml file from a Oracle table clob column? [closed]如何从 Oracle 表 clob 列中查找 xml 文件中所有元素和属性的列表? [关闭]
【发布时间】:2018-02-22 20:00:25
【问题描述】:

我正在尝试在一个 XML 文件中查找所有标签(包括其 XPATH),该文件位于 oracle 表的 CLOB 列中。能否请您对此进行查询。

【问题讨论】:

  • 嗨,欢迎来到堆栈溢出。请参阅How to Ask 链接以获取有关如何提出问题并相应更新您的问题的更多详细信息。

标签: oracle oracle12c xmltype


【解决方案1】:

可以使用 XSL 样式表生成唯一标记列表。

首先使用一个随机的sample XML 创建一个简单的表,其中的 XML 存储为 CLOB:

create table sample_xml(id number, some_xml clob);

insert into sample_xml values(1, q'[<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
   </book>
</catalog>]');

现在使用 XMLTRANSFORM 将 XML 转换为一组不同的标签,使用来自 this question 的 XML 样式表:

select xmltransform(
    xmltype(some_xml), 
    xmltype('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*" />
    <xsl:key name="kElemByName" match="*" use="name(.)"/>
    <xsl:template match="
        *[generate-id()
        =
        generate-id(key(''kElemByName'', name(.))[1])
        ]">
        <xsl:value-of select="concat(name(.), '''||chr(38)||'#xA;'')"/>
        <xsl:apply-templates select="*"/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>')) tags
from sample_xml;


TAGS
----
catalog
book
author
title

您可以通过使用regexp_substr 拆分字符串,一次获得一行结果:

select regexp_substr(replace(tags, chr(10), ','),'[^,]+', 1, level) from
(
    ... insert large query here
)
connect by regexp_substr(replace(tags, chr(10), ','),'[^,]+', 1, level) is not null;

要查看属性,请查看链接问题,它还包括用于获取属性的 XML 样式表。

【讨论】:

  • 感谢 Jon 的回复,上面的查询没有在结果中返回属性列名。如何为结果中的所有这些元素获取 XPATH?以上结果显示在一条记录中。有什么方法可以让我在每个元素的单独行中得到这个结果。再次感谢您的帮助。
  • @SrinivasAvoonuri 查看我的更新答案。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2015-01-01
  • 2015-08-08
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多