Поле Oracle XML — как узнать, что я все проанализировал?

#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. Оооо, мне нравится эта идея! Позвольте мне немного поработать с ним — я думаю, что вижу хороший путь вперед! Пустые узлы, вероятно, можно игнорировать, при условии, что у меня есть процесс, который регулярно просматривает и ищет любые новые непустые узлы.