#xml #oracle #xml-parsing
#xml #Oracle #xml-синтаксический анализ
Вопрос:
У нас есть база данных Oracle, и теперь некоторые XML-данные хранятся в CLOB. Существует около 10 тысяч записей, и мы хотим знать, когда данные изменяются, поэтому я извлекал данные из записи пары имя / значение и сохранял их в таблице аудита. Я делаю это каждый день, декодируя XML на основе определений, хранящихся в файле определений *, сохраняя его в промежуточной таблице, а затем объединяя таким образом, чтобы изменения были новыми записями. Это позволяет мне видеть значения до и после. Все это работает нормально.
Что не так, так это то, что существует почти 10 тысяч записей, я проверил их, чтобы убедиться, что я получаю все пары имя / значение, но я не просматривал каждую запись. И даже если я получил все возможности сейчас, это не значит, что в будущем не будет нового имени / значения. Мне не предоставили документы о том, как хранятся эти данные, какие есть или могут быть варианты.
Каков хороший способ убедиться, что я собираю все пары имя / значение? Или признать, что я чего-то не понимаю?
* У меня есть таблица, в которой перечислены имена полей 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 предоставлены. Мы пишем собственные отчеты из приложения, но само приложение не разрабатывается собственными силами.
Комментарии:
1. Пожалуйста, покажите пример XML и пример ключа / значения. » Мне не предоставили документы о том, как хранятся эти данные, какие есть или могут быть варианты». — может быть, вам нужно сначала решить эту проблему?
2. @OldProgrammer — Я добавил один простой пример. Я подозреваю, что форматы xml являются проприетарными, или, по крайней мере, их примечания к выпуску не утруждают себя такими подробностями.
Ответ №1:
Я как бы интерпретирую пару «имя / значение» как «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
Один из возможных недостатков в этом заключается в том, что я не думаю, что он будет собирать пустые узлы.
Отсюда я черпал вдохновение в том, как получить имя узла.
Комментарии:
1. Оооо, мне нравится эта идея! Позвольте мне немного поработать с ним — я думаю, что вижу хороший путь вперед! Пустые узлы, вероятно, можно игнорировать, при условии, что у меня есть процесс, который регулярно просматривает и ищет любые новые непустые узлы.