Нужно добавлять теги в XML файл, причем форматинг, комментарии и тд, должны остаться в таком же виде, после чего сразу отпадает половина либ, другая половина не стакаеться по лицензии. В итоге было решено пользовать возможностиjavax.xml.stream.* .
Изначально алгоритм был таков:
1. Ищу нужный тег по имени + parent path(i.e. "/organization/customers")
2. Если нахожу, то делаю found = true
3. Дальше жду что тэг непустой и пишу като так:
switch (reader.next()) {
//...
case XMLStreamConstants.CHARACTERS:
if (src == null) {
src = reader.getTextCharacters();
}
if (found) {
result.append(src, 0, reader.getTextStart());
result.append(newContent);
final int offset = reader.getTextStart() + reader.getTextLength();
result.append(src, offset, src.length - offset);
applied = true;
}
break;
}
}
что вроде бы и ок.
Но тут в спеке XMLStreamReader вижу это:
By default entity references must be expanded and reported transparently to the application. An exception will be thrown if an entity reference cannot be expanded. If element content is empty (i.e. content is "") then no CHARACTERS event will be reported.
Ну это ничего ибо есть метод
reader.getElementText().isEmpty()
и далее можно организовать логику относительно XMLStreamConstants.START_ELEMENT, XMLStreamConstants.END_ELEMENT, так же ее можно организовать похожим способом и при отсутсвии нужного тега, но есть одна проблема :
reader.getTextStart() - есть только в XMLStreamConstants.CHARACTERS, как тогда узнать позицию тега, например, при XMLStreamConstants.END_ELEMENT?