2016-02-19 41 views
0

我正在使用DOM創建XML,我用explorer打開XML並且看起來很好。 之後,我爲它創建了一個XSL,將它的引用以編程方式添加到XML和繁榮,它不再工作。無法使Java創建的XML與XSL一起工作

我檢查瀏覽器中的代碼並將文件另存爲XML。 我用記事本++打開了XML,注意到npp顯示XML文件是在「UCS-2 LE BOM」中編碼的,即使XML標題是「UTF-8」,我不知道這是否與從瀏覽器中保存或者是因爲Java變換器。 File encoding according to npp

反正我更改文件編碼核電站爲「UTF-8」,再次打開它,它完美的作品。 我試着將變換器的編碼屬性transformer.setOutputProperty("encoding", "ISO-8859-1")更改爲不同的值,但它只會更改XML標頭。 我搜索了一下,但我還沒有發現任何工作到目前爲止。

這就是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

答案不是直接對我明顯。這將有助於獲得XML和XSL文件以及一個完整的工作示例。 –

+0

你在嘗試什麼?設計或轉換您的XML? XSLT是一種轉換XML的特殊用途語言。 Java像其他通用語言一樣附帶XSLT處理器。因此,您可以直接在代碼中應用xslt,而不用xml中的內聯參考。 – Parfait

+0

我想使用XSLT在XML表格中顯示XML數據,我必須爲XML和XSLT創建兩個單獨的文件(這是一個學校作業),但使用XSLT分析器創建文件可能是個好主意。 – Imartin

回答

0

嘗試加入這一行,你叫transform()前:

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

已經嘗試:( – Imartin