2011-10-17 28 views
1

我使用Saxon(Java)將*.xhtml轉換爲*.xml(saxon dtd)java.net.SocketException:意外的服務器文件結尾

這裏是我的Java代碼:

System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl"); 
TransformerFactory tfactory = TransformerFactory.newInstance(); 
System.out.println("load xslt file"); 
Templates templates = tfactory.newTemplates(new StreamSource(xsltFile)); 

Transformer transformer = templates.newTransformer(); 
Result result = new StreamResult(new File(filtTempXml)); 
transformer.transform(new StreamSource(xmlFile), result); 

因爲有DTD在*.xhtml文件,如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

錯誤:

java.net.SocketException: Unexpected end of file from server 

我想知道:

1)如何簡單地禁用dtd? 2)如果不是,如何在Java程序中爲saxon設置目錄文件(映射dtd爲本地)?任何示例?

謝謝。

+1

檢出http://stackoverflow.com/questions/1572808/java-xml-xslt-prevent-dtd-validation – alexbrn

回答

1

最後,我知道如何實現它。

SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 
SAXParser saxParser = parserFactory.newSAXParser(); 
XMLReader xmlReader = saxParser.getXMLReader(); 

EntityResolver entityReolver = new EntityResolver() { 
    public InputSource resolveEntity(String publicId, String systemId) { 
    try { 
     System.out.println("Entity resolving systemID... " + publicId); 
     if (systemId.indexOf((".dtd")) != -1) { 
      System.out.println("Entity Resolved..."); 
      return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes())); 
     } 
    } catch (Exception e) { 
    } 
    return null; 
    } 
}; 
xmlReader.setEntityResolver(entityReolver); 

SAXSource saxSource = new SAXSource(xmlReader, SAXSource.sourceToInputSource(new StreamSource(xmlFile))); 
transformer.transform(saxSource, result); 
相關問題