Заменить закрывающий тег XML на пустой - PullRequest
2 голосов
/ 09 мая 2011

Я должен сравнить данные XML.Существует два источника:

  • Веб-служба
  • XML-файлы

Я не вижу простого способа преобразовать их в одни и те же классы и использовать равенстваmethod.

Классы, которые работают с веб-службами, генерируются автоматически, а WSDL совсем не прост.

Поэтому я читаю ответ из веб-службы, читаю соответствующий файл, преобразую их вСтрока с тем же форматированием (удаленные пробелы, \ n \ r символы и т. Д.), А затем с помощью метода String.equals ().

Проблема заключается в том, что пустые теги веб-служб записываются следующим образом:

<EmptyTag/>

но предоставленные файлы содержат пустые теги такого типа:

<EmptyTag></EmptyTag>

ОК, есть способ подготовить все предоставленные файлы вручную, но мне это не нравится.Кто знает, как можно преобразовать пустые теги в один стиль?Если есть идеи как упростить процесс - милости просим;)

ОБНОВЛЕНИЕ

Я не разбираю xml.Данные файла просто читаются и преобразуются в ожидаемый формат.Структура объекта из ответа веб-службы преобразуется в строку XML следующим образом:

    marshaller.marshal(new JAXBElement<response_class_name>(new QName("response_class_name"),
       response_class_name.class, response_object), stringWriter);

Ответы [ 6 ]

5 голосов
/ 09 мая 2011

Для Java я бы использовал XMLUnit для сравнения файлов, поскольку он сравнивает XML-файлы, используя их структуру, а не как строки (он может или не может игнорировать пробелы в зависимости от настроек).

2 голосов
/ 09 мая 2011

вы можете заменить "<(\\w+)([^>]*)?>\\s*</\\1>" на "<$1$2 />" заранее

изменить или "<(\\w+)( [^/>]*)?/>" с "<$1$2></$1>" для других;)

2 голосов
/ 09 мая 2011

Вы можете использовать модуль регулярных выражений Java, чтобы заменить все вхождения "<([^/]+?)/>" на "<\\1></\\1>".Это расширит первую форму ("") ко второй форме (" ").

1 голос
/ 09 мая 2011

Есть два варианта:

  1. Вы можете использовать что-то вроде XMLUnit для сравнения документов, чтобы убедиться, что они семантически эквивалентны.
  2. Вы можете прочитать оба XML-файла в одном и том же парсере, а затем записать их обратно в строку, используя один и тот же сериализатор. Сериализатор должен последовательно обрабатывать самозакрывающиеся теги.
1 голос
/ 09 мая 2011

Программа xmllint сделает свое дело:

$ echo '<EmptyTag></EmptyTag>' | xmllint -
<?xml version="1.0"?>
<EmptyTag/>
0 голосов
/ 09 мая 2011

Я бы, вероятно, использовал XSLT для преобразования обоих xml-файлов в один и тот же формат, но я не знаю, является ли это самым простым способом.Возможно, есть редакторы, которые могут выполнить форматирование для вас.

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