Groovy редактировать XML-файл, хранить комментарии, разрывы строк - PullRequest
9 голосов
/ 20 января 2011

Я хотел бы отредактировать существующий XML-файл, сохранив его исходный макет.Это включает в себя новые строки, комментарии и т. Д. Редактирование состоит из поиска элементов внутри XML и изменения текстового значения.

Моя первая попытка была с использованием XMLParser с XmlUtil.serialize, но это не соответствует требованию.

Кто-нибудь знает о какой-либо альтернативе XMLParser, где правки "на месте" исходной строки XML?Если нет, возможно, есть библиотека, которая выполняет поиск с использованием XPath / GPath и просто возвращает местоположение поиска, чтобы я мог сделать StringBuilder.replace.

EDIT :

На данный момент я сделал эту функцию, чтобы найти строковые индексы узла XML (которые я могу найти, используя xpath), затем я делаю замену на индексах.Прекрасно работает для простых узлов значение :

def find_location_by_node(xmlString, root_xml, node)
{
    current_index = 0;

    for(current_node in root_xml.depthFirst())
    {
      node_name = current_node.name().getLocalPart()
      current_index = xmlString.indexOf('<' + node_name, current_index);

      if(current_node == node)
      {
        end_tag = '</' + node_name + '>';
        end_tag_index = xmlString.indexOf(end_tag, current_index) + end_tag.length();

        return [current_index, end_tag_index];
      }
    }

  return -1;
}

1 Ответ

12 голосов
/ 12 февраля 2011

Вы можете обновить свой XML с помощью DOMCategory . DOM сохранит ваш оригинальный макет.

import groovy.xml.DOMBuilder

def input = '''
<shopping>
    <category type="groceries">
        <item>Chocolate</item>
        <item>Coffee</item>
    </category>
    <category type="supplies">
        <item>Paper</item>
        <item quantity="4">Pens</item>
    </category>
    <category type="present">
        <item when="Aug 10">Kathryn's Birthday</item>
        <item>Chocolate</item>
    </category>
</shopping>

'''

def doc = DOMBuilder.parse(new StringReader(input))
def root = doc.documentElement
use(groovy.xml.dom.DOMCategory) {
    def chocolate = root.depthFirst().grep{it.text() == "Chocolate"}
    chocolate*.value = "Nutella"
}

def result = groovy.xml.dom.DOMUtil.serialize(root)
println result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...