Как читать и писать файлы XML и обрабатывать узлы комментариев как текстовые узлы в Java при сохранении - PullRequest
1 голос
/ 28 сентября 2019

Я читаю XML-файл на Java, полученный из внешней системы, затем обрабатываю его и, в конечном счете, сохраняю его локально и развертываю обратно.

Внешняя система предоставляет мне XML-файл, который содержит этот узел:

    <customApplications>
        <label><!-- GDPR Management --></label>
        <name>GDPR_Management</name>
    </customApplications>

Проблема в узле комментариев.Когда я читаю файл и затем просто сохраняю его, результат выглядит следующим образом:

    <customApplications>
        <label>
            <!-- GDPR Management -->
        </label>
        <name>GDPR_Management</name>
    </customApplications>

Что является проблемой, потому что когда я развертываю файл обратно во внешнюю систему, он теперь думает, что метка имеетнекоторый текстовый контент.Поэтому мне нужен тот же результат, что и был, то есть без разрывов строк вокруг узла комментария.

Я попытался удалить все узлы комментария, что хорошо работает при развертывании файла, но файл также имеет версию с использованиемgit, и это вызывает много конфликтов слияния, поскольку файл может быть в любой момент снова извлечен из внешней системы (извлеченный файл снова с узлами комментариев, как вы можете видеть в первом примере).

Затем я попыталсяизменить все узлы комментариев на текстовые узлы перед сохранением.Результат снова неприемлем, потому что метка снова имеет некоторое текстовое содержание:

    <customApplications>
        <label>&lt;!--  GDPR Management  --&gt;</label>
        <name>GDPR_Management</name>
    </customApplications>

Как я читаю документ:

var docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
var document = docBuilder.parse(inputStream);
document.getDocumentElement().normalize();
var xp = XPathFactory.newInstance().newXPath();
var nl = (NodeList) xp.evaluate("//text()[normalize-space(.)='']", document, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); ++i) {
    var node = nl.item(i);
    node.getParentNode().removeChild(node);
}

Как я сохраняю документ:

var result = new StreamResult(outputStream);
var transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(document), result);

Мне действительно нужен тот же результат, что и в первом примере, но мне все равно, как узел комментариев будет представлен в dom при обработке файла.

Спасибо за любые советы!

1 Ответ

1 голос
/ 29 сентября 2019

Не используйте отступ = "да", если вы хотите, чтобы вывод был идентичен оригиналу.Указание indent="yes" позволяет сериализатору вставлять пробелы в любом месте.

...