无法使Java创建的XML与XSL一起工作

时间:2016-02-19 16:01:35

标签: java xml xslt dom

我正在使用DOM创建XML,我使用资源管理器打开XML,看起来很好。 之后我为它创建了一个XSL,以编程方式将其引用添加到XML和繁荣中,它不再起作用。

我检查浏览器中的代码并将文件另存为XML。 我用notepad ++打开XML并注意到npp显示XML文件是用“UCS-2 LE BOM”编码的,即使XML标题是“UTF-8”,我不知道这是否与存在有关从浏览器中保存或因为Java变换器而保存。File encoding according to npp

无论如何,我将npp中的文件编码更改为“UTF-8”,再次打开它,它完美无缺。 我已经尝试将变换器的编码属性transformer.setOutputProperty("encoding", "ISO-8859-1")更改为不同的值,但它只会更改XML标头。 我google了一下,但到目前为止我还没有发现任何有用的东西。

这是创建XML的代码

    package modelo;

import java.awt.Desktop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


public class DAOXML {

    private static final String rutaUno = ".\\VerLibro.xml";
    private static final String rutaListado = ".\\listado.xml";


    public static boolean toXML(ArrayList<Libro> libros2) {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        final String rutaActual = libros2.size()>1?rutaListado:rutaUno;


        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.newDocument();

            doc.setDocumentURI(rutaActual);
            doc.setXmlStandalone(true);

            Element libros = doc.createElement("libros");


            for(Libro l : libros2) {
                Element libro = doc.createElement("libro");
                Element isbn = doc.createElement("isbn");
                isbn.setTextContent(l.getISBN());
                libro.appendChild(isbn);
                Element editorial = doc.createElement("editorial_apellidos");
                editorial.setTextContent(l.getEditorial_apellidos());
                libro.appendChild(editorial);
                Element autor = doc.createElement("autor");
                autor.setTextContent(l.getAutor());
                libro.appendChild(autor);
                Element categoria = doc.createElement("categoria");
                categoria.setTextContent(l.getCategoria());
                libro.appendChild(categoria);
                Element titulo = doc.createElement("titulo");
                titulo.setTextContent(l.getTitulo());
                libro.appendChild(titulo);
                Element ubicacion = doc.createElement("ubicacion");
                ubicacion.setTextContent(l.getUbiacion());
                libro.appendChild(ubicacion);       
                libros.appendChild(libro);
            }
            doc.appendChild(libros);


            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
        //  transformer.setOutputProperty("encoding", "ISO-8859-1");
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(rutaActual));
            //result.setWriter(new PrintWriter(new File(rutaActual), "UTF-8"));

            transformer.transform(source, result);

            if(rutaActual == rutaUno) {
                Node pi = doc.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"VerLibro.xsl\"");
                doc.insertBefore(pi, libros);
            }
            else {
                Node pi = doc.createProcessingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"listado.xsl\"");
                doc.insertBefore(pi, libros);
            }


            Desktop.getDesktop().open(new File(rutaActual));

            return true;
        } catch (ParserConfigurationException e) {
            e.printStackTrace();

         } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;
    }


}

提前致谢。

1 个答案:

答案 0 :(得分:0)

在致电transform()之前尝试添加此行:

transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");