2014-10-09 76 views
2

我想实现一个小例子,我想将文本文件中的内容转换为使用XSL作为变换器的XML文件。我碰到过这个例子 - XSL - create well formed xml from text file在SO,我试图实现相同的,但面临一些问题。Java程序使用XSL将文本文件转换为XML

我正在使用与SO帖子中回答的输入和XSL文件相同的文本文件。这是Java程序我想使用:

public class Parser { 
    public static void main(String[] args) { 
     String path="src/"; 
     String text = path+"input.txt"; 
     String xslt = path+"input.xsl"; 
     String output = path+"output.xml"; 

     System.setProperty("javax.xml.transform.TransformerFactory",  
       "net.sf.saxon.TransformerFactoryImpl"); 
     try { 
      TransformerFactory tf = TransformerFactory.newInstance(); 

      Transformer tr = tf.newTransformer(new StreamSource(xslt)); 
      tr.transform(new StreamSource(text), new StreamResult(
        new FileOutputStream(output))); 

      System.out.println("Output to " + output); 
     } catch (Exception e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 
    } 
} 

我得到的例外是:

Error on line 1 column 1 of input.txt: 
    SXXP0003: Error reported by XML parser: Content is not allowed in prolog. 
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:418) 
    at net.sf.saxon.event.Sender.send(Sender.java:214) 
    at net.sf.saxon.event.Sender.send(Sender.java:50) 
    at net.sf.saxon.Controller.transform(Controller.java:1611) 
    at three.Parser.main(Parser.java:21) 
Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388) 
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1427) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1036) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:404) 
    ... 4 more 

看来我不能使用文本文件作为输入在我的计划。有人可以帮助我解决问题。

更新:

我已经使用Saxon S9 API(使用瓶 - saxon9he.jar)解决它由Martin在他的回答表明,这里是工作的Java代码。

import java.io.File; 

import javax.xml.transform.stream.StreamSource; 

import net.sf.saxon.s9api.Processor; 
import net.sf.saxon.s9api.QName; 
import net.sf.saxon.s9api.SaxonApiException; 
import net.sf.saxon.s9api.Serializer; 
import net.sf.saxon.s9api.XsltCompiler; 
import net.sf.saxon.s9api.XsltExecutable; 
import net.sf.saxon.s9api.XsltTransformer; 
public class Parser { 
    public static void main(String[] args) throws SaxonApiException { 
     Processor proc = new Processor(false); 
     XsltCompiler comp = proc.newXsltCompiler(); 
     XsltExecutable exp = comp.compile(new StreamSource(new File(
       "src/input.xsl"))); 
     Serializer out = new Serializer(); 
     out.setOutputProperty(Serializer.Property.METHOD, "xml"); 
     out.setOutputProperty(Serializer.Property.INDENT, "yes"); 
     out.setOutputFile(new File("src/output.xml")); 
     XsltTransformer trans = exp.load(); 
     trans.setInitialTemplate(new QName("main")); 
     trans.setDestination(out); 
     trans.transform(); 

     System.out.println("Output written to text file"); 
    } 
} 
+0

查看你引用它的SO引用,提到*必须将文本文件转换为平面XML文件*,然后才能将它提供给XSLT处理器。我认为你到目前为止跳过了这一步。您**不能**提供简单的文本文件,因为它通常不是有效的XML文件。 – 2014-10-09 12:24:01

+0

http://stackoverflow.com/questions/2310926/sxxp0003-error-reported-by-xml-parser-content-is-not-allowed-in-prolog – 2014-10-09 12:26:10

回答

2

代码中的文本转换文本XML取决于XSLT 2.0和XSLT 2.0处理器,如Saxon 9.您尝试使用的JAXP API仅适用于使用XSLT 1.0方法将XML输入文档作为XSLT代码的主要来源。因此,如果您想使用该API,则需要确保将虚拟输入XML传递给转换器,而纯文本文件的URI应作为参数传入。但是,我会建议使用Saxon S9 API来简单地启动带有命名模板main的样式表,同时也传入纯文本URI作为参数。

+0

感谢Martin,我会检查API并了解如何在独立程序中实现它。 – Chaitanya 2014-10-09 12:34:35

+0

感谢Martin,我使用了API并创建了一个程序,我用工作程序更新了我的问题。 – Chaitanya 2014-10-09 12:57:39

1

您无法将纯文本提供给XSL转换器。它只接受格式良好的XML作为输入。

所以在链接的问题的代码启动变压器无输入,然后XSLT的内部,它加载与

<xsl:variable name="csv" select="unparsed-text($pathToCSV, $encoding)" /> 
+0

谢谢亚伦,但是当我运行命令提到的java -jar saxon9he.jar -it:main -xsl:sheet.xsl'的答案,我可以在控制台中看到生成的xml。我试图用独立的java代码实现同样的事情,但是卡住了,怎么做。 – Chaitanya 2014-10-09 12:32:54