XML парсер с точным сохранением форматирования

 
 
 
Сообщения:336
Здравствуйте, коллеги.
Есть задача прочитать XML документ, внести в него некоторые изменения (изменить/удалить/добавить аттрибуты, удалить/добавить/скопировать/переместить элементы и т.д.) и сохранить документ обратно на диск. Алгоритм, который обрабатывает документ достаточно сложный, поэтому нужна удобная документная модель. Проблема в том, что надо сохранить форматирование документа, чтобы интрумены, показывающие разницу между документами, подсветили только изменения, внесенные алгоритмом, а не миллион пробелов и кавычек.
Стандартный DOM парсер не подходит совсем, поскольку он даже не берет в расчет порядок аттрибутов элемента. Dom4j и Jdom2 работают лучше, но все-равно удаляют все форматирование внутри элементов (например, если аттрибуты были отформатированны в столбик, все переносы строк удаляются), и заменяют одинарные кавычки на двойные. Стандартный SAX парсер также не дает возможность сохранить это форматирование.
Пример:
    <TaskTemplate     
        id='PolicyTask0001'    
        Name='General Reminder'
        Priority='5' 
        PriorityOverrideInd='Yes'
        Description='General Reminder For $!InsuredName.gets("CommercialName")' >
        <SecurityAttributes>
            <SecurityAttribute TypeCd='Delete' Value='No' />
            <SecurityAttribute TypeCd='Complete' Value='No' />
        </SecurityAttributes>
    </TaskTemplate>

Превращается в:
    <TaskTemplate id="PolicyTask0001" Name="General Reminder" Priority="5" PriorityOverrideInd="Yes" Description="General Reminder For $!InsuredName.gets(&quot;CommercialName&quot;)">
        <SecurityAttributes>
            <SecurityAttribute TypeCd="Delete" Value="No"/>
            <SecurityAttribute TypeCd="Complete" Value="No"/>
        </SecurityAttributes>
    </TaskTemplate>

Существует ли в природе готовый парсер, который бы мог помочь с задачей? Заранее спасибо за помощь.
 
 
Сообщения:879
Добрый день!

Вариант с нормализацией исходного документа не подходит?
Преобразованный и исходный документ тогда будут в одном формате.
 
 
Сообщения:9836
Или другое решение - использовать diff'er по-сложней, который умеет игнорировать whitespaces (как в IntelliJ). Проблему с кавычками это правда не решит, но такая настройка может и существует у marshaller'ов.
Сохранять исходное форматирование - это точно не задача парсера. Это бы пришлось хранить коллекцию аттрибутов и коллекцию whitespaces между ними. Оч странно было бы.
Изменен:05 мар 2019 08:23
 
 
Сообщения:336
Роман Осипов:
Вариант с нормализацией исходного документа не подходит?

К сожалению, нет. Документы долгое время редактировались вручную и пользователи хотят, чтобы они продолжали выглядеть также.

Староверъ:
Или другое решение - использовать diff'er по-сложней, который умеет игнорировать whitespaces (как в IntelliJ). Проблему с кавычками это правда не решит, но такая настройка может и существует у marshaller'ов.

У нас, к сожалению, нет возможности выбирать, какой диффер будут использовать пользователи. Да это и не сильно поможет - во-первых кавычки, во-вторых аттрибуты, выравненные в столбик.

Староверъ:
Сохранять исходное форматирование - это точно не задача парсера. Это бы пришлось хранить коллекцию аттрибутов и коллекцию whitespaces между ними. Оч странно было бы.

Ну мне кажется, не очень странно. В конце концов, они же умеют сохранять форматирование между элементами.

Нашел VTD-XML, который, похоже, делает точно то, что мне нужно. Он не разбирает документ на кусочки, а работает непосредственно с исходником, точечно внося изменения. Правда, он под GPL лицензией - пока не понимаю, могу я его в проекте использовать или нет (Update - не могу :-/ ). Да и API у него на первый взляд немного пугающий :)
Изменен:05 мар 2019 22:11
 
 
Сообщения:879
Есть еще ANTLR
https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687107/Parsing+XML

Вроде как для таких случаев подходит.
 
 
Сообщения:336
Роман Осипов:
Есть еще ANTLR
https://theantlrguy.atlassian.net/wiki/spaces/ANTLR3/pages/2687107/Parsing+XML

Вроде как для таких случаев подходит.

Хорошая идея. Попробую, спасибо!
 
 
Сообщения:5
Добрый день,

Есть библиотека, которая умеет форматировать xml файл.

Вы можете отформатировать файл, изменить и потом сравнивать.

https://github.com/javadev/underscore-java

Вызов: U.formatXml(xml).

С уважением, Валентин
Изменен:22 авг 2019 20:55
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет