2015-06-10 1 views
0

Я использую Saxon парсер, чтобы разделить большой файл на более мелкие. Ниже мой пример кода,Java Saxon Parsing

TransformerFactory tFactory = TransformerFactory.newInstance(); 
      Transformer transformer = tFactory 
        .newTransformer(new StreamSource(new File(xsltPath))); 
      StringWriter sw = new StringWriter(); 
      StreamResult result = new StreamResult(sw); 
      transformer.transform(new StreamSource(new File(sourcePath)), 
        new StreamResult(new File(resultDir))); 

Где SourcePath = C: /path/Temp/AppModule.xml xsltPath = C: /path/Temp/create-fragment.xslt resultDir = C:/путь/Temp/

Этот код разделяет AppModule.xml на более мелкие XML-файлы отлично, но с исключением в консоли,

Ошибка java.io.FileNotFoundException: C: \ путь \ Temp (доступ запрещен) net.sf.saxon.trans.XPathException: java.io.FileNotFoundException: C: \ путь \ Temp (доступ запрещен)

Я googled и обнаружил, что я должен указать точное имя файла для нового метода File(). Но, как вы видите, имя файла, которое я не знаю во время компиляции, только во время выполнения анализатор идентифицирует входной файл AppModule.xml и разбивает xml на более мелкие файлы с именем тега значения в нем.

AppModule.xml

<?xml version='1.0' encoding='UTF-8'?> 
<data> 
<value>A1</value> 
<value>B1</value> 
<value>C1</value> 
<value>A2</value> 
<value>B2</value> 
<value>C2</value> 
</data> 

Выход: A1.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<test>A1</test> 

Точно так же она будет создавать B1, C1, A2, B2, C2 файлы соответственно.

Пожалуйста, поделитесь своими ценными замечаниями.

+0

Вы можете отсканировать каталог и найти файлы, которые были созданы, а затем присвоить их дескрипторам 'File'. Смотрите: [«Как сканировать папку в Java»] (http://stackoverflow.com/questions/189094/how-to-scan-a-folder-in-java) –

+0

Вы уверены, что ваша проблема не в том: В доступе отказано"? Убедитесь, что права доступа к файлам верны или измените местоположение на доступное программе. – Risadinha

ответ

1

Файл, который вы указываете в объекте результата, не должен быть каталогом. Если преобразование не производит «первичный» выходной файл, но только производит вывод с использованием xsl:result-document, тогда вы должны указать файл результатов как-то вроде new File("c:/path/temp/dummy.xml"). Этот файл будет использоваться в качестве «базового выходного URI» для разрешения любого относительного имени файла, указанного в xsl:result-document/@href.

API, который вы используете, называется JAXP, и проблема в том, что он был разработан для XSLT 1.0, где у вас мог быть только один результирующий документ. Saxon попытался расширить концепции в JAXP, чтобы он работал с XSLT 2.0, но он не предназначен для работы. Возможно, вам понравится использовать интерфейс s9api Saxon в качестве альтернативы.