2015-11-18 2 views
0

J'ai une tâche simple:Comment préserver les commentaires et la déclaration XML lors de l'analyse de fichiers XML à l'aide de SAX?

Je voudrais lire un fichier XML et le renvoyer le plus complètement possible. Avec le code suivant, il y a deux problèmes qui subsistent:

  1. commentaires sont supprimés
  2. Je n'ai pas accès au XML Déclaration

code Java:

package com.stackoverflow.tests; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class XmlParsing { 

    public static void main(String[] args) { 

    StringBuffer b = new StringBuffer(); 

    try { 

     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 

     DefaultHandler handler = new DefaultHandler() { 

     @Override 
     public void startElement(String uri, String localName, String qName, Attributes attributes) 
      throws SAXException { 

      b.append("<" + qName + attributesToString(attributes) + ">"); 
     } // END: startElement() 



     @Override 
     public void endElement(String uri, String localName, String qName) 
      throws SAXException { 

      b.append("</" + qName + ">"); 
     } // END: endElement 



     @Override 
     public void characters(char ch[], int start, int length) 
      throws SAXException { 

      b.append(new String(ch, start, length)); 

     } // END: characters() 



     }; // END: DefaultHandler 

     saxParser.parse("./src/main/ressources/XmlTest/validWithAttributesCommentsInlineElements.xml", handler); 

     System.out.println(b.toString()); 

    } catch (Exception e) { 
     e.printStackTrace(); 

    } // END: try 

    } // END: main 



    public static String attributesToString(Attributes a) { 
    StringBuffer sb = new StringBuffer(); 
    for(int i = 0; i < a.getLength(); i++) { 
     sb 
     .append(" ") 
     .append(a.getQName(i)) 
     .append("=\"") 
     .append(a.getValue(i)) 
     .append("\""); 
    } 
    return sb.toString(); 
    } 



} // END: Class XmlParsing 

Je parse la Suivant le fichier XML ...:

<?xml version="1.0" encoding="UTF-8"?> 
<A attr="1" aaa="2"> 
    <F>general</F> 
    <B test="3"> 
     <C>element 1</C> 
     <C>element 2</C> 
     <C>element 3</C> 
    </B> 
    <D>general</D> 
    <E>general</E> 

    <inline-element/> 
    <inline-element with="attributes"/> 

    <!-- Comment --> 

    <inline-element /> 
    <inline-element with="attributes" /> 

</A> 

et obtenez:

<A attr="1" aaa="2"> 
    <F>general</F> 
    <B test="3"> 
     <C>element 1</C> 
     <C>element 2</C> 
     <C>element 3</C> 
    </B> 
    <D>general</D> 
    <E>general</E> 

    <inline-element></inline-element> 
    <inline-element with="attributes"></inline-element> 



    <inline-element></inline-element> 
    <inline-element with="attributes"></inline-element> 

</A> 

Il est bien pour moi qu'un <elem /> devient <elem></elem>, mais je voudrais vraiment avoir accès à XML-déclaration et les commentaires.

Répondre

1

Pour avoir accès à un événement lorsqu'un commentaire est vu, vous devez utiliser un gestionnaire Lexcial. Voir https://docs.oracle.com/javase/tutorial/jaxp/sax/events.html

+0

Comment puis-je utiliser le gestionnaire avant de l'implémenter? Je ne le mets pas en marche. – Edward

+0

Ordre de code modifié –

+0

Cela a fonctionné. Avez-vous aussi une idée de comment obtenir le '? – Edward