首页 > 解决方案 > Oracle XML 字段 - 如何知道我已经解析了所有内容?

问题描述

我们有一个 Oracle 数据库,现在有一些 XML 数据存储在 CLOB 中。有近 10K 条记录,我们想知道数据何时发生变化,所以我一直在名称/值对记录中提取数据,并将其保存到审计表中。我每天都这样做,根据定义文件*中存储的定义对 XML 进行解码,将其保存到临时表中,然后以更改为新记录的方式进行合并。这让我可以看到之前和之后的值。一切正常。

不好的是,有近 10K 条记录,我已经对它们进行了抽查,以确保我得到了所有的名称/值对,但我并没有检查每条记录。即使我现在已经获得了所有可能性,但这并不意味着将来不会有新的名称/价值。我还没有得到关于如何存储这些数据、选项是什么或可以是什么的文档。

什么是确保我获取所有名称/值对的好方法?或者承认我没有得到什么?

*我有一个列出 xml 字段名称的表,以及一些允许我对其进行解码的附加信息。它告诉我它是一个列表还是一个数组,并帮助我对其进行解码。这可能有点做作,但我不是 XML 专家。明显地。

这是一些 XML 示例(是的,我意识到它格式不正确)。这是一个简单的例子,我至少要处理几十种格式,到目前为止,我已经确定了超过 250 个名称/值对,对于这个,我将在这个例子下面列出。

<calcFinalValuesDetails>
<measured>
    <uom>AMP</uom>
    <shouldRetainMeasuredSq>C1NO</shouldRetainMeasuredSq>
</measured>
</calcFinalValuesDetails>
<processing>
    <formula>ML*R1</formula>
</processing>
<billFactors>
    <billFactorsList>
        <sequence>1</sequence>
        <billFactor>AMP2MPP</billFactor>
    </billFactorsList>
</billFactors>

从这里,我提取以下内容:

<uom> = AMP
<shouldRetainMeasuredSq> = C1NO
<formula> = ML*R1
<billFactors>1<billFactor> = AMP2MPP

如您所见,我们完全定义每个值并不重要,但它需要足以让用户识别,并且我想获取所有可能存储的值。

我已经检查过了,到目前为止似乎没有提供潜在的 XML 选项。我们从应用程序编写自己的报告,但应用程序本身不是内部开发的。

标签: xmloraclexml-parsing

解决方案


我有点将“名称/值”对解释为“具有文本内容的 XML 节点,无论其深度如何”。此查询构造一个中间节点,其中包含此类节点的名称和文本内容,然后将它们提取到行中:

select x.*
  from xmltable( 'for $n in //*[@text()] return <dummy name="{$n/name(.)}" value="{$n/text()}" />' 
                 passing myxmlvalue 
                 columns "nodename"  varchar2(100) path './@name', 
                         "nodevalue" varchar2(100) path './@value'  ) x

myxmlvalue您的 XML 文档在哪里。我用上面的示例 XML 对此进行了测试,在<root>它周围包裹了一个元素以使其成为有效的 XML 并获得:

nodename                nodevalue
----------------------  ---------
uom                     AMP
shouldRetainMeasuredSq  C1NO
formula                 ML*R1
sequence                1
billFactor              AMP2MPP

一个可能的缺陷是我认为它不会拾取空节点。

我从这里获得了如何获取节点名称的灵感。


推荐阅读