Je recherche un simple extrait Java pour éliminer les étiquettes vides d'une structure xml devrait devenir; p>
9 Réponses :
avec XSLT, vous pouvez transformer votre XML pour ignorer les balises vides et ré-écrire le document. p>
Cette feuille de style Xslt devrait faire ce que vous recherchez:
<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>
Je me demandais s'il serait facile de le faire avec le Bibliothèque XOM et a donné un essai .
Il s'est avéré être assez facile: p> Cela ne traitera probablement pas correctement tous les cas d'angle, comme un document complètement vide. Et quoi faire sur les éléments qui sont autrement vides mais ont des attributs? P> Si vous souhaitez enregistrer des balises XML avec des attributs, nous pouvons ajouter dans la méthode "Handlenode". Vérifier: P> ... && ((Element) node).getAttributeCount() == 0) )
Note latérale: Les différents états d'une étiquette ont en fait de la signification: p>
null code> ou nil code> li>
-
étiquette manquante: strong> L'élément n'existe pas li>
ul>
Donc, en supprimant des étiquettes et des étiquettes à open-fermées vides, vous les fusionnez avec le groupe de balises manquantes et perdez ainsi des informations. P>
Très bon point - il est parfois utile de supprimer les étiquettes dont la valeur est vide ou null, mais il y a aussi des moments où cela pourrait être potentiellement préjudiciable à l'application.
Pour mon but, cela n'est pas pertinent
Si le XML est alimenté comme chaîne; Regex pourrait être utilisé pour filtrer les éléments vides: Ceci trouvera des éléments vides. p> données dans ce cas une variable contenant votre String XML. de
Ne disant pas que ce serait le meilleur des solutions, mais c'est possible ... p> p>
Je devais ajouter des éléments de bandes et d'indents à la réponse de Chris R, sinon les blocs englobent, nouvellement vide, ne sont pas supprimés:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" />
<xsl:template match="@*|node()">
<xsl:if test=". != '' or ./@* != ''">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Pour supprimer toutes les balises vides, même si elles sont l'une après l'autre, une solution possible est la suivante:
private void removeEmptyTags(Document document) {
List<Node> listNode = new ArrayList<Node>();
findListEmptyTags(document.getRootElement(), listNode);
if (listNode.size() == 0)
return;
for (Node node : listNode) {
node.getParent().removeChild(node);
}
removeEmptyTags(document);
}
private void findListEmptyTags(Node node, List<Node> listNode) {
if (node != null && node.getChildCount() == 0 && "".equals(node.getValue()) && ((Element) node).getAttributeCount() == 0) {
listNode.add(node);
return;
}
// recurse the children
for (int i = 0; i < node.getChildCount(); i++) {
findListEmptyTags(node.getChild(i), listNode);
}
}
J'ai testé les tests d'échantillons de Jonik et Marco. Mais ce ne sont pas exactement ce que je veux. J'ai donc modifié leur source et ci-dessous le code fonctionne bien pour moi. J'ai déjà ajusté ce code dans mon projet. Veuillez le tester si vous voulez.
public String removeEmptyNode(String xml){
String cleanedXml = null;
try{
xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + xml;
InputStream input = new ByteArrayInputStream(xml.getBytes("UTF-8"));
Document document = new Builder().build(input);
removeEmptyNode(document.getRootElement());
cleanedXml = document.toXML();
}catch(Exception e){
e.printStackTrace();
}
return cleanedXml;
}
private static void removeEmptyNode(Node node) {
if(node.getChildCount()!=0){
int count = node.getChildCount();
for (int i = count-1; i >= 0 ; i--) {
removeEmptyNode(node.getChild(i));
}
}
doCheck(node);
}
private static void doCheck(Node node){
if(node.getChildCount() == 0 && "".equals(node.getValue().trim())) {
try{node.getParent().removeChild(node);}catch(Exception e){}
}
}
<xml>
<field1>bla</field1>
<field2></field2>
<field3/>
<structure1>
<field4>
<field50>
<field60/>
</field50>
</field4>
<field5></field5>
</structure1>
</xml>
<xml>
<field1>bla</field1>
</xml>
Avez-vous actuellement l'analyse du XML dans des structures de données de manière particulière (JDOM, etc.)? Ou commencez-vous à partir de zéro?
TYPO Dans l'exemple XML: Structure1 n'est pas correctement fermé