2011-01-31 6 views
4

J'essaie d'écrire un fichier XML avec une indentation correcte. Voici mon code:Formatage du fichier XML: Indentation

public class WebVideo { 

private final String C_XMLFILEPATH = "resources/video.xml"; 
private String itemId; 
private String videoPath; 

public WebVideo(long itemId, String videoPath) { 
    this.itemId = Long.toString(itemId); 
    this.videoPath = videoPath; 
} 

public void saveVideo() throws ParserConfigurationException, IOException, 
    TransformerFactoryConfigurationError, TransformerException, 
    SAXException { 
    File xmlFile = new File(C_XMLFILEPATH); 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
    .newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory 
    .newDocumentBuilder(); 
    Document document = null; 
    Element rootElement = null; 

    if (xmlFile.exists()) { 
    document = documentBuilder.parse(xmlFile); 
    rootElement = document.getDocumentElement(); 

    } else { 
    document = documentBuilder.newDocument(); 
    rootElement = document.createElement("Videos"); 
    document.appendChild(rootElement); 
    } 

    Element itemElement = document.createElement("Video"); 
    rootElement.appendChild(itemElement); 

    Element idElement = document.createElement("Id"); 
    Text id = document.createTextNode(itemId); 
    idElement.appendChild(id); 
    itemElement.appendChild(idElement); 

    Element pathElement = document.createElement("Path"); 
    Text path = document.createTextNode(videoPath); 
    pathElement.appendChild(path); 
    itemElement.appendChild(pathElement); 

    Transformer transformer = TransformerFactory.newInstance() 
    .newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty(
    "{http://xml.apache.org/xslt}indent-amount", "4"); 

    StreamResult streamResult = new StreamResult(new StringWriter()); 
    DOMSource domSource = new DOMSource(document); 
    transformer.transform(domSource, streamResult); 
    String xmlString = streamResult.getWriter().toString(); 

    BufferedWriter bufferedWriter = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream(xmlFile))); 
    bufferedWriter.write(xmlString); 
    bufferedWriter.flush(); 
    bufferedWriter.close(); 
} 
} 

Tout va bien, mais si vous voyez attentivement le fichier XML de sortie il y a un problème quand j'ajouter un nouvel élément. Le fichier XML de sortie est ici:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <Videos> 
     <Video> 
      <Id>1</Id> 
      <Path>path</Path> 
     </Video> 
    <Video> 
      <Id>2</Id> 
      <Path>path</Path> 
     </Video> 
    </Videos> 

La balise se trouve dans le même retrait que la balise. Comment puis-je résoudre ce problème? Merci.

+0

double possible de [Comment imprimer assez XML de Java?] (Http://stackoverflow.com/questions/139076/how-to- pretty-print-xml-from-java) – ThomasRS

Répondre

2

Vous pouvez. créez également votre propre format de ligne si vous voulez plus de personnalisation. Ajoutez le texte avant linebreak vous ajoutez l'enfant réel:

Text lineBreak = doc.createTextNode("\n\t"); 

element.appendChild(lineBreak); 
0
public String formatXML(String input) 
{ 
    try 
    { 
     final InputSource src = new InputSource(new StringReader(input)); 
     final Node document = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder().parse(src).getDocumentElement(); 

     final DOMImplementationRegistry registry = DOMImplementationRegistry 
       .newInstance(); 
     final DOMImplementationLS impl = (DOMImplementationLS) registry 
       .getDOMImplementation("LS"); 
     final LSSerializer writer = impl.createLSSerializer(); 

     writer.getDomConfig().setParameter("format-pretty-print", 
       Boolean.TRUE); 
     writer.getDomConfig().setParameter("xml-declaration", true); 

     return writer.writeToString(document); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
     return input; 
    } 
}