Как преобразовать XML в HTML, используя XSLT в ANDROID? - PullRequest
2 голосов
/ 20 января 2012

Я работаю над проектом Android (2.2), который нуждается в преобразовании xsl. Приведенный ниже код прекрасно работает в обычном не Android-проекте Java

public static String transform() throws TransformerException {
    Source xmlInput = new StreamSource(new File("samplexml.xml"));
    Source xslInput = new StreamSource(new File("samplexslt.xslt"));

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(xslInput); 

    OutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
    transformer.transform(xmlInput, result);
    return baos.toString();
}

Мне нужен аналогичный функционал на Android. Для этого я создал 2 файла в ресурсах / raw:

  1. samplexml.xml
  2. samplexslt.xslt

(содержимое этих файлов взято с здесь .

Я попробовал приведенный ниже код, и он не работает (обратите внимание на конструктор StreamSource arg):

public static String transform() throws TransformerException {
    TransformerFactory factory = TransformerFactory.newInstance();

    Source xmlInput = new StreamSource(this.getResources().openRawResource(R.raw.samplexml));
    Source xslInput = new StreamSource(this.getResources().openRawResource(R.raw.samplexslt));

    Transformer transformer = factory.newTransformer(xslInput);//NullPointerException here
    OutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
    transformer.transform(xmlInput, result);
}

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

Итак, в проекте Android, как обрабатывать преобразования xslt? Пожалуйста, выскажите ваши мысли.

Ответы [ 2 ]

2 голосов
/ 19 октября 2013

Поскольку мы знаем, что we Cannot usethisin a static context, и вы делаете это в своем статическом методе transform(). Вы можете сделать это так:

public class YourLoadXSLClass extends Activity {
static Resources res;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    res = getResources();

    String strHTML = transform();
    // Other code.....

}

/*
 * Your method that Transform CSLT.
 */
public static String transform() throws TransformerException {
    TransformerFactory factory = TransformerFactory.newInstance();

    // Now your raw files are accessible here.
    Source xmlInput = new StreamSource(
            LoadXSLTinWebview.res.openRawResource(R.raw.samplexml));
    Source xslInput = new StreamSource(
            LoadXSLTinWebview.res.openRawResource(R.raw.samplexslt));

    Transformer transformer = factory.newTransformer(xslInput);

    OutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
    transformer.transform(xmlInput, result);
    return baos.toString();
 }

}

Здесь - это полный код класса, который делает все необходимое. Я надеюсь, что это поможет вам и всем!

0 голосов
/ 20 января 2012

Я никогда ничего не делал с XSLT, но, глядя на ваш код, логически есть только две вещи, которые могут вызвать NPE в этой строке. Во-первых, factory может быть null, но это не имеет смысла.

Это оставляет xslInput виновником, который предполагает, что openRawResource(R.raw.samplexslt) не может вернуть действительный InputStream для использования конструктором StreamSource. Попробуйте добавить запись в журнал, например ...

if (xslInput != null {
    Transformer transformer = factory.newTransformer(xslInput);
    ...
}
else
    Log.d("SomeTAG", "xslInput is null!!!");

Если выясняется, что xslInput на самом деле null, значит, openRawResource(...) не может правильно найти / обработать файл .xslt. В этом случае я бы предложил использовать AssetManager, чтобы открыть файл .xslt по имени ...

AssetManager am = this.getAssets();
Source xslInput = new StreamSource(am.open("samplexslt.xslt"));
...