How to transform xml with xslt and display it in Android webview

岁酱吖の 提交于 2020-01-10 02:03:48

问题


I am trying to display the xml data, which was transformed by xsl file, onto the webview in an Android application. However, the data is not displayed as expected.

XML file used (cdcatalog_with_xsl.xml)  -- Sample xml data
--------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<!-- Edited by XMLSpy® -->
<catalog>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
</catalog>


XSL file used (cdcatalog.xsl)  -- Sample xsl file
-----------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
      <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Would some body help me with a sample code to load this data into webview of Android app?


回答1:


Its quite tricky, i try to make it easy to understand. Just follow below steps_

  1. Build your XSLT file under res/raw,
  2. either parse your XML or be ready with your XML(in res/raw)
  3. Finally, consume these to display in Android Webview

your cdcatalog_with_xsl.xml & cdcatalog.xsl must be there in res/raw. I have build LoadXSLTinWebview that servers your need_

public class LoadXSLTinWebview extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().requestFeature(Window.FEATURE_PROGRESS);

    WebView webview = new WebView(this);
    setContentView(webview);

    //Reading XSLT
    String strXSLT = GetStyleSheet(R.raw.cdcatalog);
    //Reading XML
    String strXML = GetStyleSheet(R.raw.cdcatalog_with_xsl);
    /*
     * Loading XSLT...
     */
      //Transform ...
      String html=StaticTransform(strXSLT, strXML);
      //Loading the above transformed CSLT in to Webview...
      webview.loadData(html,"text/html",null);

}

/*
 * Transform XSLT to HTML string
 */
public static String StaticTransform(String strXsl, String strXml) {
    String html = "";

    try {

        InputStream ds = null;
        ds = new ByteArrayInputStream(strXml.getBytes("UTF-8"));

        Source xmlSource = new StreamSource(ds);

        InputStream xs = new ByteArrayInputStream(strXsl.getBytes("UTF-8"));
        Source xsltSource = new StreamSource(xs);

        StringWriter writer = new StringWriter();
        Result result = new StreamResult(writer);
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(xsltSource);
        transformer.transform(xmlSource, result);

        html = writer.toString();

        ds.close();
        xs.close();

        xmlSource = null;
        xsltSource = null;

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerFactoryConfigurationError e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return html;
}

/*
 * Read file from res/raw...
 */
private String GetStyleSheet(int fileId) {
    String strXsl = null;

        InputStream raw = getResources().openRawResource(fileId);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        int size = 0;
        // Read the entire resource into a local byte buffer.
        byte[] buffer = new byte[1024];
        try {
            while ((size = raw.read(buffer, 0, 1024)) >= 0) {
                outputStream.write(buffer, 0, size);
            }
            raw.close();

            strXsl = outputStream.toString();

            Log.v("Log", "xsl ==> " + strXsl);
        } catch (IOException e) {
            e.printStackTrace();
        }

    return strXsl;

}

}

OutPut:

I hope this will help all!



来源:https://stackoverflow.com/questions/16318998/how-to-transform-xml-with-xslt-and-display-it-in-android-webview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!