2011-11-24 13 views
8

Używam linku this do generowania pliku XML za pomocą DOM. Mówi, że "Parser Xerces jest dołączony do dystrybucji JDK 1.5. Nie musisz pobierać parsera osobno."Serialize DOM do FileOutputStream przy użyciu Xerces

Jednak, gdy napiszę następujący wiersz w moim Eclipse Helios, daje to błąd podczas kompilacji, mimo że mam Java 1.6 w moim systemie.

import org.apache.xml.serialize.XMLSerializer; 

Dlaczego tak jest?

Odpowiedz

26

Xerces jest w zestawie z JDK, ale powinieneś używać go z interfejsem API JAXP pod numerem javax.xml.parsers. Sprawdź wyjście programu poniżej.

Ponadto, aby serializować XML Document, należy użyć DOM Level 3 Load and Save (obecny w JDK) lub transformacji XSLT bez arkusza stylów (transformacja tożsamości). Reszta zależy od konkretnej implementacji. Xerces XMLSerializer jest przestarzałe:

Przestarzałe. Ta klasa została uznana za przestarzałą w Xerces 2.9.0. Zaleca się, aby nowe aplikacje używały LSSerializera DOM Level 3 lub JAXP Transformation API dla XML (TrAX) do serializacji XML. Więcej informacji można znaleźć w dokumentacji Xerces.

Oto przykład serializacji z DOM Level 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(); 
    } 
} 

Oto przykład z transformacji tożsamości:

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

Dziękuję. Pomogło to :) – whitehat

+0

Jeśli uważasz, że może to być uznane za odpowiedź, możesz ją zgłosić? – lkuty

+1

Zwiększyłem liczbę, klikając "Ta odpowiedź jest przydatna" :) – whitehat

1

Będzie w IIRC, com.sun.org.apache.xml.serialize.XMLSerializer. Są to jednak prywatne klasy i prawdopodobnie mogą się zmienić w dowolnym momencie. Proponuję zamiast tego używać standardowych publicznych interfejsów API (javax.* i przyjaciół). (Użyj API transformacji bez żadnego XSLT.)

Powiązane problemy