Python 2.7处理Atlassian Fisheye XML转HTML表格:如何将表头移至顶部?
嘿,这个问题我之前也碰到过类似的!Fisheye返回的这种XML结构确实有点反直觉,表头放最后太坑人了。给你两种简单的解决思路,看你偏好哪种:
方法一:直接在Python中分离表头与数据行(最简单)
既然你已经在Python里生成HTML表格了,那最省事的办法就是先把XML里的headings和row节点内容分别提取出来,再先渲染表头、后渲染数据行。用Python2.7自带的xml.etree.ElementTree就能搞定,不需要额外装库,改动也很小:
import xml.etree.ElementTree as ET # 假设你的XML响应内容存在response_xml变量中 tree = ET.fromstring(response_xml) # 先收集表头和数据行 headings = [] rows = [] # 遍历所有节点,分离表头和数据 for elem in tree.iter(): if elem.tag == 'headings': # 提取每个表头文本 headings = [h.text for h in elem.findall('heading')] elif elem.tag == 'row': # 提取每行的单元格内容 row_cells = [cell.text for cell in elem.findall('cell')] rows.append(row_cells) # 生成HTML表格(这里沿用你之前的样式逻辑即可) html_output = '<table style="border-collapse: collapse; width: 100%;">' # 先加表头行 html_output += '<thead><tr>' for heading in headings: html_output += f'<th style="border: 1px solid #ddd; padding: 8px;">{heading}</th>' html_output += '</tr></thead>' # 再加数据行 html_output += '<tbody>' for row in rows: html_output += '<tr>' for cell in row: html_output += f'<td style="border: 1px solid #ddd; padding: 8px;">{cell}</td>' html_output += '</tr>' html_output += '</tbody></table>' # 输出或保存结果 print(html_output)
这种方法的优势是逻辑直接,完全在你现有Python代码流程里解决,不需要额外工具,改动成本最低。
方法二:用XSLT完成XML到HTML的转换
如果你更倾向于把XML转换的逻辑和Python代码分离,或者以后有更多类似的XML转换需求,也可以用XSLT来处理。
首先写一个XSLT样式表(比如命名为fisheye_table.xsl),在里面指定先渲染表头、再渲染数据行:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <table style="border-collapse: collapse; width: 100%;"> <!-- 优先渲染末尾的表头 --> <thead> <tr> <xsl:for-each select="//headings/heading"> <th style="border: 1px solid #ddd; padding: 8px;"> <xsl:value-of select="."/> </th> </xsl:for-each> </tr> </thead> <!-- 再渲染所有数据行 --> <tbody> <xsl:for-each select="//row"> <tr> <xsl:for-each select="cell"> <td style="border: 1px solid #ddd; padding: 8px;"> <xsl:value-of select="."/> </td> </xsl:for-each> </tr> </xsl:for-each> </tbody> </table> </xsl:template> </xsl:stylesheet>
然后在Python中用lxml库执行转换(注意Python2.7需要安装兼容版本的lxml,比如pip install lxml==4.6.5):
from lxml import etree # 加载XML响应和XSLT文件 xml_tree = etree.fromstring(response_xml) xslt_transformer = etree.XSLT(etree.parse('fisheye_table.xsl')) # 执行转换得到HTML html_result = xslt_transformer(xml_tree) print(str(html_result))
总结
如果只是解决当前的表头顺序问题,方法一绝对是最简单的选择——不需要额外依赖,直接在你现有代码里调整数据提取和输出的顺序就行。XSLT更适合复杂场景下的XML转换逻辑复用。
内容的提问来源于stack exchange,提问作者RCross
相关产品推荐
相关产品推荐

