2011-01-28 26 views
3

我正在使用libxml2和libxslt來處理XML文件。返回值是類型實例,但我需要一個UTF-8靜態字符串。Python - 將<type'instance'>轉換爲<type 'str'>?

styledoc = libxml2.parseFile(style_file) 
style = libxslt.parseStylesheetDoc(styledoc) 
doc = libxml2.parseDoc(xml_data.encode("UTF-8")) 
html = style.applyStylesheet(doc) 

return html # <- this has to be a utf-8 static string 

如何將返回值轉換爲靜態字符串?

感謝您的任何幫助。

+0

建議您重新格式化您的代碼以進行清晰的通信。 – Drake 2011-01-28 11:08:18

+0

「我需要一個unicode(UTF-8)字符串」 - 好吧,哪個? unicode!= UTF-8。 – 2011-01-28 11:15:13

回答

2

使用

return style.saveResultToString(html) 

而不是return html

這裏是XML和XSLT測試文件我用,我的測試代碼

test.xsl

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" encoding="UTF-8" /> 
    <xsl:template match="/"> 
     <html> 
     <head> 
      <title>學生名簿</title> 
     </head> 
     <body> 
     <h1>學生名簿</h1> 

     <table border="1"> 
      <tr> 
       <th>學生番號</th><th>氏名</th><th>電話番號</th><th>住所</th> 
      </tr> 
      <xsl:for-each select="學生名簿/學生" > 
      <tr> 
       <td><xsl:value-of select="學生番號" /></td> 
       <td><xsl:value-of select="氏名" /></td> 
       <td><xsl:value-of select="電話番號" /></td> 
       <td><xsl:value-of select="住所" /></td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

的test.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<學生名簿> 
    <學生> 
     <學生番號>23</學生番號> 
     <氏名>あ</氏名> 
     <電話番號>111-111-1111</電話番號> 
     <住所>○市○町</住所> 
    </學生> 
    <學生> 
     <學生番號>20</學生番號> 
     <氏名>い</氏名> 
     <電話番號>222-222-2222</電話番號> 
     <住所>×市×町</住所> 
    </學生> 
    <學生> 
     <學生番號>17</學生番號> 
     <氏名>う</氏名> 
     <電話番號>333-333-3333</電話番號> 
     <住所>△市△町</住所> 
    </學生> 
    <學生> 
     <學生番號>18</學生番號> 
     <氏名>え</氏名> 
     <電話番號>444-444-4444</電話番號> 
     <住所>◇市◇町</住所> 
    </學生> 
    <學生> 
     <學生番號>22</學生番號> 
     <氏名>お</氏名> 
     <電話番號>555-555-5555</電話番號> 
     <住所>▽市▽町</住所> 
    </學生> 
</學生名簿> 

測試代碼

import libxml2 
import libxslt 

styledoc = libxml2.parseFile("test.xsl") 
style = libxslt.parseStylesheetDoc(styledoc) 
doc = libxml2.parseFile("test.xml") 
html = style.applyStylesheet(doc, None) 

print style.saveResultToString(html) 

,並導致

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>學生名簿</title> 
</head> 
<body> 
<h1>學生名簿</h1> 
<table border="1"> 
<tr> 
<th>學生番號</th> 
<th>氏名</th> 
<th>電話番號</th> 
<th>住所</th> 
</tr> 
<tr> 
<td>23</td> 
<td>あ</td> 
<td>111-111-1111</td> 
<td>○市○町</td> 
</tr> 
<tr> 
<td>20</td> 
<td>い</td> 
<td>222-222-2222</td> 
<td>×市×町</td> 
</tr> 
<tr> 
<td>17</td> 
<td>う</td> 
<td>333-333-3333</td> 
<td>△市△町</td> 
</tr> 
<tr> 
<td>18</td> 
<td>え</td> 
<td>444-444-4444</td> 
<td>◇市◇町</td> 
</tr> 
<tr> 
<td>22</td> 
<td>お</td> 
<td>555-555-5555</td> 
<td>▽市▽町</td> 
</tr> 
</table> 
</body> 
</html> 

如果你好奇

>>> style.saveResultToString(html) 
'<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<title>\xe5\xad\xa6\xe7\x94\x9f\xe5\x90\x8d\xe7\xb0\xbf</title>\n</head>\n<body>\n<h1>\xe5\xad\xa6\xe7\x94\x9f\xe5\x90\x8d\xe7\xb0\xbf</h1>\n<table border="1">\n<tr>\n<th>\xe5\xad\xa6\xe7\x94\x9f\xe7\x95\xaa\xe5\x8f\xb7</th>\n<th>\xe6\xb0\x8f\xe5\x90\x8d</th>\n<th>\xe9\x9b\xbb\xe8\xa9\xb1\xe7\x95\xaa\xe5\x8f\xb7</th>\n<th>\xe4\xbd\x8f\xe6\x89\x80</th>\n</tr>\n<tr>\n<td>23</td>\n<td>\xe3\x81\x82</td>\n<td>111-111-1111</td>\n<td>\xe2\x97\x8b\xe5\xb8\x82\xe2\x97\x8b\xe7\x94\xba</td>\n</tr>\n<tr>\n<td>20</td>\n<td>\xe3\x81\x84</td>\n<td>222-222-2222</td>\n<td>\xc3\x97\xe5\xb8\x82\xc3\x97\xe7\x94\xba</td>\n</tr>\n<tr>\n<td>17</td>\n<td>\xe3\x81\x86</td>\n<td>333-333-3333</td>\n<td>\xe2\x96\xb3\xe5\xb8\x82\xe2\x96\xb3\xe7\x94\xba</td>\n</tr>\n<tr>\n<td>18</td>\n<td>\xe3\x81\x88</td>\n<td>444-444-4444</td>\n<td>\xe2\x97\x87\xe5\xb8\x82\xe2\x97\x87\xe7\x94\xba</td>\n</tr>\n<tr>\n<td>22</td>\n<td>\xe3\x81\x8a</td>\n<td>555-555-5555</td>\n<td>\xe2\x96\xbd\xe5\xb8\x82\xe2\x96\xbd\xe7\x94\xba</td>\n</tr>\n</table>\n</body>\n</html>\n' 

你可以將它與.decode解碼(「UTF-8 UTF-8字符串「)如果你懷疑它不是utf8

>>> style.saveResultToString(html).decode("utf8") 
u'<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<title>\u5b66\u751f\u540d\u7c3f</title>\n</head>\n<body>\n<h1>\u5b66\u751f\u540d\u7c3f</h1>\n<table border="1">\n<tr>\n<th>\u5b66\u751f\u756a\u53f7</th>\n<th>\u6c0f\u540d</th>\n<th>\u96fb\u8a71\u756a\u53f7</th>\n<th>\u4f4f\u6240</th>\n</tr>\n<tr>\n<td>23</td>\n<td>\u3042</td>\n<td>111-111-1111</td>\n<td>\u25cb\u5e02\u25cb\u753a</td>\n</tr>\n<tr>\n<td>20</td>\n<td>\u3044</td>\n<td>222-222-2222</td>\n<td>\xd7\u5e02\xd7\u753a</td>\n</tr>\n<tr>\n<td>17</td>\n<td>\u3046</td>\n<td>333-333-3333</td>\n<td>\u25b3\u5e02\u25b3\u753a</td>\n</tr>\n<tr>\n<td>18</td>\n<td>\u3048</td>\n<td>444-444-4444</td>\n<td>\u25c7\u5e02\u25c7\u753a</td>\n</tr>\n<tr>\n<td>22</td>\n<td>\u304a</td>\n<td>555-555-5555</td>\n<td>\u25bd\u5e02\u25bd\u753a</td>\n</tr>\n</table>\n</body>\n</html>\n' 
1

圖書館應該有這方法。如果沒有,你必須自己寫,這可能不是微不足道的。不幸的是,我找不到任何有用的Python綁定文檔,所以我明白你是否找不到。

您可能想要查看lxml,它是一個使用相同c庫但具有與ElementTree兼容的API的模塊。

相關問題