2017-08-07 12 views
2

私はJavaとXSLのスタイルシートを使ってXMLファイルから値を取り出し、それをテキストファイルに出力しています。javax.xml.transform.Sourceの文字列操作

TransformerFactory factory = TransformerFactory.newInstance(); 
    Source xslt = new StreamSource(new File("transform.xsl")); 
    Transformer transformer = factory.newTransformer(xslt); 
    Source text = new StreamSource(new File("inputXML.txt"));   
    transformer.transform(text, new StreamResult(new File("output.txt"))) ; 

しかし、最近、私は私が読んれるXMLファイルは2つのルートノードを持っていない1になることがわかった。以下は

を使用するプログラムです。だから私は、私は以下のエラーを避けることができるようにプログラム的に私自身のルートノードを追加するには、文字列操作を行うことを考えています:

ERROR: 'The markup in the document following the root element must be well-formed.' ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The markup in the document following the root element must be well-formed.'

をしかし、私はjavax.xml.transform.Sourceの上の任意の文字列操作の操作を行うことができません(キャスティングが機能していない)。 私は中間ノードファイルを使用してルートノードを追加したくないので、50kのXMLレコードの近くで処理する必要があるため、コストがかかることが懸念されます。

答えて

0

StreamSourceは、Javaの世界であなたがそうあなたは、単に、例えば、あなたの他のファイルを参照するファイルを作成することができますexternal entitiesをサポートしたのXercesのようなXMLパーサを持っていることをいくつかのコンストラクタ

Path inputPath = Paths.get("inputXML.txt"); 
String input = new String(Files.readAllBytes(inputPath, 
        StandardCharsets.UTF_8)); 
input = input.replaceFirst("<quasiroot", "<root>$0") 
    + "</root>"; 

Source text = new StreamSource(new StringReader(input));   
+0

結果を達成するために「入力」がどのように処理されるかを少し変更しました。ありがとうございました 。とても有難い –

0

注意を持っています

<!DOCTYPE root [ 
    <!ENTITY input SYSTEM "inputXML.txt"> 
]> 
<root>&input;</root> 

あなたがする必要があるのは、そのファイルをXSLTのソースとして読み込むだけです。必要に応じて、上記のように直接文字列として構築し、StringReaderを介してStreamSourceに渡すことができます。ここでは、システムIDをあなたのディレクトリに設定します。入力XML:

String input = "inputXML.txt"; 
    File dir = new File("."); 
    String baseUri = dir.toURI().toASCIIString(); 
    String inputXml = "<!DOCTYPE root [ <!ENTITY input SYSTEM \"" + input + "\">]><root>&input;</root>"; 
    TransformerFactory factory = TransformerFactory.newInstance(); 
    Source xslt = new StreamSource(new File("transform.xsl")); 
    Transformer transformer = factory.newTransformer(xslt); 
    Source text = new StreamSource(new StringReader(inputXml), baseUri); 
    transformer.transform(text, new StreamResult(new File("output.txt")));