2011-11-24 23 views
8

Estoy usando el enlace this para generar un archivo XML usando DOM. Dice que "Xerces parser se incluye con la distribución JDK 1.5. Por lo tanto, no es necesario descargar el analizador por separado".Serializar DOM a FileOutputStream usando Xerces

Sin embargo, cuando escribo la siguiente línea en mi Eclipse Helios, se produce un error en tiempo de compilación aunque tengo Java 1.6 en mi sistema.

import org.apache.xml.serialize.XMLSerializer; 

¿Por qué es así?

Respuesta

26

Xerces está realmente incluido con el JDK, pero debe usarlo con la JAXP API bajo javax.xml.parsers. Verifique el resultado del programa a continuación.

Además, para serializar un XML Document, debe usar DOM Nivel 3 Cargar y Guardar (presente en el JDK) o una transformación XSLT sin hoja de estilo (transformación de identidad). El resto depende de una implementación específica. Xerces XMLSerializer está en desuso:

Obsoleto. Esta clase quedó obsoleta en Xerces 2.9.0. Se recomienda que las nuevas aplicaciones utilicen el LSSerializer DOM Level 3 o la API de transformación de JAXP para XML (TrAX) para serializar XML. Consulte la documentación de Xerces para obtener más información.

Aquí es un ejemplo de serialización con DOM nivel 3:

import org.w3c.dom.*; 
import org.w3c.dom.bootstrap.DOMImplementationRegistry; 
import org.w3c.dom.ls.*; 

public class DOMExample3 { 

    public static void main(String[] args) throws Exception { 
     DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();  
     DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("XML 3.0 LS 3.0"); 
     if (impl == null) { 
      System.out.println("No DOMImplementation found !"); 
      System.exit(0); 
     } 

     System.out.printf("DOMImplementationLS: %s\n", impl.getClass().getName()); 

     LSParser parser = impl.createLSParser(
       DOMImplementationLS.MODE_SYNCHRONOUS, 
       "http://www.w3.org/TR/REC-xml"); 
     // http://www.w3.org/2001/XMLSchema 
     System.out.printf("LSParser: %s\n", parser.getClass().getName()); 

     if (args.length == 0) { 
      System.exit(0); 
     } 

     Document doc = parser.parseURI(args[0]); 

     LSSerializer serializer = impl.createLSSerializer(); 
     LSOutput output = impl.createLSOutput(); 
     output.setEncoding("UTF-8"); 
     output.setByteStream(System.out); 
     serializer.write(doc, output); 
     System.out.println(); 
    } 
} 

Aquí se muestra un ejemplo de una transformación de identidad:

import org.w3c.dom.Document; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class DOMExample2 { 
    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder parser = factory.newDocumentBuilder(); 

     System.out.println("Parsing XML document..."); 
     Document doc; 
     doc = parser.parse(args[0]); 

     // Xerces Java 2 

     /* Deprecated. This class was deprecated in Xerces 2.9.0. 
     * It is recommended that new applications use the DOM Level 3 
     * LSSerializer or JAXP's Transformation API for XML (TrAX) 
     * for serializing XML and HTML. 
     * See the Xerces documentation for more information. 
     */ 
     /* 
     System.out.println("XERCES: Displaying XML document..."); 
     OutputFormat of = new OutputFormat(doc, "ISO-8859-1", true); 
     PrintWriter pw = new PrintWriter(System.out); 
     BaseMarkupSerializer bms = new XMLSerializer(pw, of); 
     bms.serialize(doc); 
*/ 
     // JAXP 

     System.out.println("JAXP: Displaying XML document..."); 
     TransformerFactory transFactory = TransformerFactory.newInstance(); 
     System.out.println(transFactory.getClass().getName()); 
     //transFactory.setAttribute("indent-number", 2); 
     Transformer idTransform = transFactory.newTransformer(); 
     idTransform.setOutputProperty(OutputKeys.METHOD, "xml"); 
     idTransform.setOutputProperty(OutputKeys.INDENT,"yes"); 
     // Apache default indentation is 0 
     idTransform.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");     
     Source input = new DOMSource(doc); 
     Result output = new StreamResult(System.out); 
     idTransform.transform(input, output); 
    } 
} 
+0

Gracias. Esto ayudó :) – whitehat

+0

Si crees que podría considerarse como una respuesta, ¿podrías marcarlo? – lkuty

+1

Aumenté el conteo haciendo clic en "Esta respuesta es útil" :) – whitehat

1

Será en, IIRC, com.sun.org.apache.xml.serialize.XMLSerializer. Sin embargo, esas son clases privadas y es probable que cambien en cualquier momento. Sugiero usar las API públicas estándar (javax.* y amigos) en su lugar. (Utilice la API de transformación sin ningún XSLT.)

Cuestiones relacionadas