2011-01-28 11 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

+0

「ユニコード(UTF-8)文字列を持つ必要がありますか?」ユニコード!= UTF-8。 –

+0

ありがとうコメントを追加しました。 – Marlon

答えて

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' 

あなたが( "UTF-8 .decodeでそれを復号することができる場合は、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' 
+0

ありがとうございます。それがトリックでした。 – Marlon

1

これはライブラリ内にメソッドがあるはずです。そうでない場合は、あなた自身で書く必要があります。これはおそらく些細なことではありません。残念ながら、私はPythonバインディングのための有用なドキュメントを見つけることができないので、これを見つけることができないかどうかはわかります。

同じcライブラリを使用するが、ElementTreeと互換性のあるAPIを持つモジュールであるlxmlを調べるとよいでしょう。