Python - преобразовать <тип 'экземпляр'> в <тип 'str'>? - PullRequest
3 голосов
/ 28 января 2011

Я использую libxml2 и libxslt для обработки файлов XML. Возвращаемое значение имеет тип экземпляра, но мне нужно иметь статическую строку UTF-8.

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

Как я могу преобразовать возвращаемое значение в статическую строку?

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Использование

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>

И строка UTF-8, если вам интересно

>>> 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"), если вы подозреваете, что это не 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 голос
/ 28 января 2011

Должны быть методы для этого в библиотеке.Если нет, то вы должны написать их сами, что, вероятно, не тривиально.К сожалению, я не могу найти никаких полезных документов для привязок Python, поэтому я понимаю, если вы не можете это выяснить.

Возможно, вы захотите взглянуть на lxml, модуль, который использует те же библиотеки c, но имеет API, совместимый с ElementTree.

...