Подключили node.js к Java-приложению и хотите получить вывод в html

Я создал дочерний процесс в node.js и дал ему расположение исполняемого файла jar.

var fs = require('fs');

var exec = require('child_process').exec;
var child = exec('java -jar C:/Users/njaiswal/Desktop/Executable/Saxon.jar',
  function (error, stdout, stderr){
    fs.writeFile('output.html', +stdout);
    if(error !== null){
      console.log("Error -> "+error);
    }
});

module.exports = child;

Это мой Saxon.java, который я преобразовал в файл jar. Как видите, эта java-программа принимает файл result1.xml и таблицу стилей defaultfrontend.xslt и конвертирует их в веб-страницу html (output.html).

import java.io.File;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Saxon {

  /**
   * Simple transformation method.
   * 
   * @param sourcePath
   *          - Absolute path to source xml file.
   * @param xsltPath
   *          - Absolute path to xslt file.
   * @param resultDir
   *          - Directory where you want to put resulting files.
   */
  public static void simpleTransform(String sourcePath, String xsltPath,
      String resultDir) {
    TransformerFactory tFactory = TransformerFactory.newInstance();
    try {
      Transformer transformer = tFactory
          .newTransformer(new StreamSource(new File(xsltPath)));

      transformer.transform(new StreamSource(new File(sourcePath)),
          new StreamResult(new File(resultDir)));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    // Set saxon as transformer.
    System.setProperty("javax.xml.transform.TransformerFactory",
        "net.sf.saxon.TransformerFactoryImpl");

    simpleTransform("result1.xml", "defaultfrontend.xslt", "output.html");

  }
}

Итак, эта программа конвертирует xml в html с помощью таблицы стилей xslt. Я хочу получить свой вывод (в html) в node.js.

Но когда я пытаюсь запустить свой javascript, я не получаю никаких результатов. Результат выглядит так: http://i.stack.imgur.com/S0xg0.png


person Rose    schedule 02.05.2016    source источник
comment
это дает какую-то ошибку? вы можете попробовать напечатать stderr?   -  person Deendayal Garg    schedule 02.05.2016
comment
Это не дает мне никаких ошибок. Когда я перехожу к output.html, я получаю 0 (ноль).   -  person Rose    schedule 02.05.2016
comment
Небольшой комментарий по поводу производительности: инициализация виртуальной машины Java для выполнения единственного преобразования - довольно высокие накладные расходы. Но нет необходимости усугублять ситуацию, используя метод загрузки JAXP для создания TransformerFactory, когда вы уже знаете, что хотите использовать Saxon. Просто создайте экземпляр Saxon напрямую, заменив TransformerFactory.newInstance() на new net.sf.saxon.TransformerFactoryImpl()   -  person Michael Kay    schedule 03.05.2016
comment
Спасибо, Майкл. Сделаю это.   -  person Rose    schedule 03.05.2016


Ответы (2)


Похоже, вы ничего не пишете в stdout, а в file. Но в node вы берете stdout и снова записываете его в file.

Если вы хотите, чтобы java выводила stdout, измените

 transformer.transform(new StreamSource(new File(sourcePath)),
      new StreamResult(new File(resultDir)));

TO

transformer.transform(new StreamSource(new File(sourcePath)), 
     new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));

исходный код

Тогда вы сможете читать стандартный вывод из nodejs

person oak    schedule 02.05.2016
comment
Я отредактировал свою java-программу, как вы указали, но по-прежнему не получаю никаких результатов. Мои результаты выглядят так: i.stack.imgur.com/S0xg0.png - person Rose; 02.05.2016
comment
что происходит, когда вы запускаете его на command line? Вы видите какой-нибудь результат? - person oak; 02.05.2016
comment
$ java -jar C: /Users/njaiswal/Desktop/Executable/Saxon.jar - person oak; 02.05.2016
comment
Когда я запустил java -jar C: /Users/njaiswal/Desktop/Executable/Saxon.jar, он показывает Caused by: java.io.FileNotFoundException: C: \ demo \ 6_javanode \ onebox-default.xsl (система не может найти файл указано). На самом деле моя таблица стилей интерфейса по умолчанию использует несколько других файлов, например onebox-default.xsl. На самом деле я использовал eclipse для создания исполняемого файла jar. Программа java использует файлы xml и xslt. Это может быть ошибка, потому что файлы xml и xslt находятся в моем eclipse. Я думаю, что файл jar не использует мои файлы xml и xslt. - person Rose; 02.05.2016
comment
Что ж, согласно вашему коду, xsl и html должны находиться в той же папке, что и ваш running location, то есть при вашем последнем запуске в `C: \ demo \ 6_javanode` - person oak; 02.05.2016
comment
да. Понятно. Теперь, когда я запускаю java -jar C: /Users/njaiswal/Desktop/Executable/Saxon.jar, я получаю свою html-страницу. Но когда я просматриваю node.js, я получаю только NaN в output.html. - person Rose; 02.05.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person Rose; 02.05.2016
comment
Конечно. Спасибо. Цени свое время - person Rose; 02.05.2016

Это сработало для меня:

var fs = require('fs');
var pathToFile = 'output.html';

var exec = require('child_process').exec;
var child = exec('java -jar Saxon.jar', function (error, stdout, stderr){
    fs.writeFile(pathToFile, stdout, function(err) {
       if(err) console.error(err);
    })
});
person Rose    schedule 02.05.2016