xml - 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 选项。我们从应用程序编写自己的报告,但应用程序本身不是内部开发的。
解决方案
我有点将“名称/值”对解释为“具有文本内容的 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
一个可能的缺陷是我认为它不会拾取空节点。
我从这里获得了如何获取节点名称的灵感。
推荐阅读
- javascript - 所有者名称和区域返回未定义 - Discord v13
- node.js - NodeJS 猫鼬 | 为什么事务超时?
- php - 显示除产品 ID 32 之外的所有 WooCommerce 产品的自定义复选框
- r - 使用 purrr、broom 和 dplyr1.0.0 中的几个不同预测器将 glm 应用于相同的结果变量
- oracle - 推荐的表设计 - APEX 21.1 / Oracle 19c
- python - 添加最后一列以计算百分比变化
- jenkins - 如何将詹金斯节点列表带入活动选择参数并仅显示当前登录用户的节点
- c - switch-case 执行时间是否可变?
- python - 如何找到周期 t=1...50的 k t+1的值?
- python - OperationalError:查询期间丢失与 MySQL 服务器的连接