Удалить узел XML с помощью Java SE - PullRequest
2 голосов
/ 25 августа 2011

Как удалить узлы XML в Java SE?Я использую org.apache.xerces.Благодарю.Приведенный ниже код не работает.

DOMParser parser = new DOMParser();
System.out.println(DIR_STRING + "/" + jmsFileNameString);
parser.parse(DIR_STRING + "/" + jmsFileNameString);
Document doc = parser.getDocument();
NodeList list = doc.getElementsByTagName("*");
for (int i = 0; i < list.getLength(); i++) {
    if (list.item(i).getNodeName().matches(HEADER_REGEXP)) {
        list.item(i).getParentNode().removeChild(list.item(i)));
    }
}

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Создание всего DOM для этого довольно излишне. У вас в памяти будет все дерево XML, которое может быть довольно тяжелым для больших документов. Я предлагаю одно из следующего:

  • Разбор с SAX или StAX, просто копирование материала на вывод, если вы не хотите, чтобы он отфильтровывался.
  • Примените XSLT-преобразование, которое копирует все по умолчанию, но имеет один или несколько шаблонов, которые ничего не делают со своим вводом, таким образом, отфильтровывая его.

Вариант 2 - самый простой, и, по моему опыту, XSLT в Java быстр и экономит память, особенно для такого простого варианта использования, как этот.

Эти два шаблона будут вам нужны:

Копия по умолчанию

<xsl:template match="node()|@*">
    <xsl:copy><xsl:apply-templates select="node()|@*"/><xsl:copy>
</xsl:template>

«Фильтр»:

<xsl:template match="//*[your predicate here]">
    <!-- Don't do a thing -->
</xsl:template>

РЕДАКТИРОВАТЬ: Я только что заметил, что вы не просто отфильтровывать конкретные имена, но те, которые соответствуют регулярному выражению. Функции XPath может быть достаточно, чтобы предикат выбирал целевые узлы. Но при необходимости функции Java String можно использовать в XSLT через расширение. Это действительно делает это решение немного более сложным, но все же стоит того, чтобы взять анализ XML из ваших рук.

0 голосов
/ 25 августа 2011

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

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

0 голосов
/ 25 августа 2011

Это работает;однако, это не сохраняет в файл XML.Изменения сохраняются в объекте Document.

Для сохранения в объекте Document в файле:

    OutputFormat of = new OutputFormat("XML","UTF-8",true);
    XMLSerializer serializer = new XMLSerializer();
    serializer.setOutputFormat(of);
    serializer.setOutputByteStream(new FileOutputStream(PATH));
    serializer.serialize(doc);
...