Java Удаляет пустые XML-тэги

Версия 12 Studio Sun является бесплатной загрузкой (СВОБОДНАЯ и заплаченная доступная поддержка) - http://developers.sun.com/sunstudio/downloads/thankyou.jsp?submit=%A0FREE+Download%A0%BB%A0 .

я уверен, что у Вас есть завершение кода и отлаживающий поддержку включая сменную поддержку в этом IDE.

Studio Sun доступен для Linux, а также Соляриса. форумы: http://developers.sun.com/sunstudio/community/forums/index.jsp . Studio Sun форумы Linux: http://forum.sun.com/forum.jspa?forumID=855

я буду стремиться услышать Вашу обратную связь на этом инструменте.

BR,
~A

5
задан Mohammad Faisal 25 September 2017 в 07:58
поделиться

5 ответов

Мне было интересно, будет ли это легко сделать с помощью библиотеки XOM , и я попробовал.

Это оказалось довольно просто:

import nu.xom.*;

import java.io.File;
import java.io.IOException;

public class RemoveEmptyTags {

    public static void main(String[] args) throws IOException, ParsingException {
        Document document = new Builder().build(new File("original.xml"));
        handleNode(document.getRootElement());
        System.out.println(document.toXML()); // empty elements now removed
    }

    private static void handleNode(Node node) {
        if (node.getChildCount() == 0 && "".equals(node.getValue())) {
            node.getParent().removeChild(node);
            return;
        }
        // recurse the children
        for (int i = 0; i < node.getChildCount(); i++) { 
            handleNode(node.getChild(i));
        }
    }
}

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

Если вы хотите сохранить теги XML с атрибутами, мы можем добавить в метод handleNode следующую проверку:

... && ((Element) node).getAttributeCount() == 0) )

Кроме того, если в XML есть два или несколько пустых тегов, один за другим; этот рекурсивный метод не удаляет все пустые теги!

(Этот ответ является частью моей оценки XOM как потенциальной замены dom4j .)

7
ответ дан 18 December 2019 в 07:09
поделиться

Эта таблица стилей XSLT должна делать то, что вы ищете:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:if test=". != '' or ./@* != ''">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

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

To:

Если вы хотите знать, как применять XSLT в Java, на Interwebs должно быть множество руководств. Удачи!

8
ответ дан 18 December 2019 в 07:09
поделиться

В качестве примечания: разные состояния тега на самом деле имеют значение:

  • Открытый-закрытый тег: Элемент существует, и его значение представляет собой пустую строку
  • Одинарный -Tag: Элемент существует, но его значение равно null или nil
  • Отсутствует тег: Элемент не существует

Итак, удалив пустой Open- Закрытые теги и одиночные теги, вы объединяете их с группой отсутствующих тегов и, таким образом, теряете информацию.

3
ответ дан 18 December 2019 в 07:09
поделиться

Если xml подается как строка; регулярное выражение можно использовать для фильтрации пустых элементов:

<(\\w+)></\\1>|<\\w+/>

Это найдет пустые элементы.

data.replaceAll(re, "")

data в данном случае переменная, содержащая вашу строку xml.
Я не говорю, что это лучшее решение, но это возможно ...

1
ответ дан 18 December 2019 в 07:09
поделиться

С помощью XSLT вы можете преобразовать свой XML, чтобы игнорировать пустые теги и переписать документ.

0
ответ дан 18 December 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: