2013-05-01 21 views
6

Tôi đang cố gắng hiển thị dữ liệu xml, được chuyển đổi bởi tệp xsl, trên webview trong một ứng dụng Android. Tuy nhiên, dữ liệu không được hiển thị như mong đợi.Làm thế nào để chuyển đổi xml với xslt và hiển thị nó trong Android webview

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> 

Một số cơ quan có thể giúp tôi lấy mã mẫu để tải dữ liệu này vào chế độ xem web của ứng dụng Android không?

+0

Bạn có thể cần cụ thể hơn về đầu ra mong đợi là gì. – Henrik

+0

Tôi không thể tải lên ảnh chụp màn hình của đầu ra ... tuy nhiên, dự kiến ​​sẽ hiển thị bảng có hai cột và hai hàng dữ liệu từ xml. –

Trả lời

10

Khá phức tạp của nó, tôi cố gắng làm cho nó dễ hiểu. Chỉ cần làm theo dưới đây steps_

  1. Tạo các tập XSLT của bạn dưới res/raw,
  2. hoặc phân tích cú pháp XML của bạn hoặc sẵn sàng với XML của bạn (trong res/raw)
  3. Cuối cùng, tiêu thụ những để hiển thị trong Android WebView

cdcatalog_with_xsl.xml & cdcatalog.xsl của bạn phải có mặt ở đó trong res/raw. Tôi đã xây dựng LoadXSLTinWebview rằng các máy chủ need_ bạn

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:

output

Tôi hy vọng điều này sẽ giúp tất cả!

+0

Có điều này giúp tôi rất nhiều. Cảm ơn bạn đã đăng bài này giúp tiết kiệm thời gian của tôi. –

+0

Cảm ơn bạn đã trả lời câu trả lời này! Chỉ nhận thấy rằng bạn thay đổi XML và XSL trong onCreate. Bạn nên thay đổi điều này, lần đầu tiên tôi thử mã này nó không hoạt động. Chỉ có một thay đổi của 2 tên chuỗi;) –