Сравнение XML в Java - PullRequest
       3

Сравнение XML в Java

3 голосов
/ 11 ноября 2010

Вот два XML, я пытаюсь сравнить и поместить соответствующие данные в таблицу Excel.

У меня есть многомерный массив, называемый положениями.

<xml>
<Item type="ItemHeader" name="Plan Features" id="id_1"></Item>
<Item type="Deductible" name="Deductible" id="a">Calendar Year
 <Item type="Text" name="Individual" id="b">5,000</Item>
 <Item type="Text" name="Family" id="c">10,000</Item>
 <Item type="Text" name="Family Out-of-Network" id="id_4">15,000</Item>
</Item>
<Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2">
 <Item type="Text" name="Individual" id="d">5,000</Item>
 <Item type="Text" name="Family" id="e">10,000</Item>
</Item>
<Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item>
<Item type="Text" name="Coinsurance" id="f"></Item>
<Item type="Text" name="Office Visits" id="g"></Item>
<Item type="Text" name="Routine Physicals" id="h"></Item>
<Item type="Text" name="Preventive Care" id="m"></Item>
<Item type="Text" name="Physician Services" id="i"></Item>
<Item type="Text" name="Emergency Room Services / Urgent Care" id="j"></Item>
<Item type="Text" name="Hospital Admission Services" id="k"></Item>
<Item type="Text" name="Chiropractic" id="n"></Item>
<Item type="Text" name="Prescription Drugs" id="l"></Item>
<Item type="Text" name="Specialty Drugs" id="o"></Item>
<Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item>
<Item type="Boolean" name="Conversion Privilege" id="p">false</Item>
<Item type="ItemHeader" name="Plan Setup" id="id_3"></Item>
<Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item>
<Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item>
<Item type="Participation" name="Participation Requirement" id="s"></Item>
</xml>

И

<xml>
<Item type="ItemHeader" name="Plan Features" id="id_1"></Item>
<Item type="Deductible" name="Deductible" id="a">Calendar Year
 <Item type="Text" name="Individual" id="b">3,000</Item>
 <Item type="Text" name="Family" id="c">6,000</Item>
</Item>
<Item lock="|delete|" type="Empty" name="Out-of-Pocket Annual Maximum" id="id_2">
 <Item type="Text" name="Individual" id="d">5,000</Item>
 <Item type="Text" name="Family" id="e">10,000</Item>
</Item>
<Item type="Text" name="Life Time Maximum" id="u">Unlimited</Item>
<Item type="Text" name="Coinsurance" id="f"></Item>
<Item type="Text" name="Office Visits" id="g"></Item>
<Item type="Text" name="Routine Physicals" id="h"></Item>
<Item type="Text" name="Preventive Care" id="m"></Item>
<Item type="Text" name="Physician Services" id="i"></Item>
<Item type="Text" name="Emergency Room Services / Urgent Care" id="j"></Item>
<Item type="Text" name="Hospital Admission Services" id="k"></Item>
<Item type="Text" name="Chiropractic" id="n"></Item>
<Item type="Text" name="Prescription Drugs" id="l"></Item>
<Item type="Text" name="Specialty Drugs" id="o"></Item>
<Item type="Boolean" name="Pre Tax Reduction Available" id="t">false</Item>
<Item type="Boolean" name="Conversion Privilege" id="p">false</Item>
<Item type="ItemHeader" name="Plan Setup" id="id_3"></Item>
<Item type="Termination" name="Benefit Termination Date" id="q">Immediate</Item>
<Item type="Determination" name="Premium Redetermination Date" id="r">Not Applicable</Item>
<Item type="Participation" name="Participation Requirement" id="s"></Item>
</xml>

Теперь эти данные XML предназначены для 2 планов, и мой массив положений содержит

положений == [[Особенности плана ,,] [Франшиза ,,] [Индивидуальный ,,] .....]

Это то, что я сделал

for(int j = 0; j < plans.length; j++){
    Vector<String> vr = (Vector<String>) tagidPlan.get(plans[j].getId());
    for(int i = 0; i < vr.size(); i++){
     provisions[i][j+1] = getValues(plans[j],vr.get(i));
    }
}

Проблема возникает, когда этот дополнительный узел Family Out-of-network входит в картину. Это мой окончательный массив

[[Plan Features:, Medical HMO, Medical PPO], [Deductible Year:, Calendar Year, Calendar Year], [Individual:, 5,000, 3,000], [Family:, 10,000, 6,000], [Family Out-of-Network:, 15,000, null], [Out-of-Pocket Annual Maximum:, null, 5,000], [Individual:, 5,000, 10,000], [Family:, 10,000, Unlimited], [Life Time Maximum:, Unlimited, ], [Coinsurance:, , ], [Office Visits:, , ], [Routine Physicals:, , ], [Preventive Care:, , ], [Physician Services:, , ], [Emergency Room Services / Urgent Care:, , ], [Hospital Admission Services:, , ], [Chiropractic:, , ], [Prescription Drugs:, , ], [Specialty Drugs:, , false], [Pre Tax Reduction Available:, false, false], [Conversion Privilege:, false, ], [Plan Setup:, , Immediate], [Benefit Termination Date:, Immediate, Not Applicable], [Premium Redetermination Date:, Not Applicable, ], [Participation Requirement:, , null]]

Я хочу получить правильные значения в соответствующем элементе массива.

Больше кода можно посмотреть здесь pastie.org / 1308625

Ответы [ 5 ]

4 голосов
/ 12 ноября 2010

Не используйте массив.

Используйте: Map<String, Map<String, String>>

, чтобы:

  • первая строка (ключ к внешней карте) былаимя объекта (например, «Максимальное время жизни»)
  • вторая строка (ключ к внутренней карте) - это имя плана (в ваших XML-документах, похоже, нет реальных имен планов, так что «Plan1"и" Plan2 "может быть достаточно)
  • третья строка (значение для внутренней карты) должна быть значением для этого конкретного объекта в этом конкретном плане (например," Неограниченный "для" Максимальное время жизни "в" Plan1")

Вы можете иметь:

{ Life Time Maximum: { Plan1: Unlimited, Plan2: Unlimited } }
{ Family Out-Of-Network: { Plan1: 15,000 } }

, так как, в отличие от массива, количество записей для каждой функции не должно быть фиксированным (разные функции могут иметь разныеколичество записей)

3 голосов
/ 11 ноября 2010
2 голосов
/ 21 ноября 2010

Взгляните на DiffX (API Java с открытым исходным кодом для XML Diffing).Он предоставляет алгоритмы для сравнения XML-документов, и он дает вам хорошую сводку узлов / атрибутов / текста, которые были добавлены / удалены / изменены (изменения обозначаются как удаление, а затем вставка).Мы используем его в проекте, в котором я сейчас участвую;это работает очень хорошо.

1 голос
/ 19 ноября 2010

Вот простой алгоритм:

  • Загрузка данных в две модели DOM
  • Перебор всех узлов в первой модели, сначала глубина (т. Е. Сначала работа с дочерними, а затем с родительскими узлами)
  • Попробуйте найти такой же узел во второй модели. Если вы не можете найти один -> Вы нашли узел, который существует только в документе 1
  • Сравнить все атрибуты между двумя узлами. Добавьте любые отличия к вашему листу Excel
  • Удалить узел во втором документе, если у него нет дочерних элементов
  • Итерация по всем узлам во второй модели, сначала глубина
  • Попробуйте найти такой же узел в первой модели. Если вы не можете найти один -> Вы нашли узел, который существует только в документе 2

В зависимости от структуры (т. Е. Если вы уверены, что узлы всегда одинаковы и могут отличаться только атрибуты / дочерние элементы текста), некоторые шаги можно пропустить.

0 голосов
/ 11 ноября 2010

Я думаю, вы заново изобретаете колесо. Посмотрите на эти альтернативы с открытым исходным кодом: http://blogs.msdn.com/b/dmahugh/archive/2008/06/18/open-xml-diff-tools.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...