哪些使用python生成xml

思路:

怎么样行使python生成xml

 

目前要用python生成3个xml格式的公文。因为有部分内容是中文,原来的xml文件中应用了CDATA
的有个别。 而此前的python程序所用的库中没有创造那个区域的章程。无奈钻探了多数天。 最终用了 from lxml import etree
那几个库的措施。 那里将可运转的 python程序分享出来。 供我们参考。
经过测试,那段代码是足以平素运转生成xml格式内容的。 互连网参照的最主倘若
http://lxml.de/api/index.html 那一个网页。

 

 

 

复制代码

 1 # -*- coding:utf-8 -*-

 2 import sys

 3 import time

 4 import string

 5  

 6 from lxml import etree

 7 

 8 

 9 #安装暗中认可字符集为UTF八 不然有个别时候转码会出难点

10 default_encoding = ‘utf-8’

11 if sys.getdefaultencoding() != default_encoding:

12     reload(sys)

13     sys.setdefaultencoding(default_encoding)

14 

15 def create_xml():

16 

17     data = etree.Element(“data”)

18     #1 interface_version

19     interface_version_txt = ‘5’

20     interface_version = etree.SubElement(data, ‘interface_version’)

21     interface_version.text = interface_version_txt

22     #2 site

23     site_txt = ‘www.xxx.com’

24     site = etree.SubElement(data, ‘site’)

25     site.text = site_txt

26     #3 lastmod

27     lastmod_txt = time.strftime(‘%Y-%m-%d’, time.localtime())

28     lastmod = etree.SubElement(data, ‘lastmod’)

29     lastmod.text = lastmod_txt

30     #5 app

31     app = etree.SubElement(data, ‘app’)

32     #6 title 

33     title_txt = u’%s’ % ‘真心话大冒险’

34     title_txt = etree.CDATA(title_txt)

35     title = etree.SubElement(app, ‘title’)

36     title.text = title_txt

37     #7 appid

38     appid = etree.SubElement(app, ‘appid’)

39     appid.text = ‘%s’ % ‘222’

40 

41     dataxml = etree.tostring(data, pretty_print=True,
encoding=”UTF-8″, method=”xml”, xml_declaration=True, standalone=None)

42     print dataxml

43     

44      

47 if __name__ == ‘__main__’:

48     create_xml()

http://www.bkjia.com/Pythonjc/878470.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/878470.htmlTechArticle如何使用python生成xml
方今要用python生成多个xml格式的公文。因为有一些内容是中文,原来的xml文件中应用了CDATA
的有个别。 而在此以前的python程…

一.用到xslt样式,那样能够很好的和xml结合,做出能够的告知

2.生成xml结构

 

xslt样式是个很风趣,也很强劲的,以后用的诸多,很便利就能做出贰个杰出的告诉,能够百度时而,语法相当简单,跟写html大概的.

在此处能够定制好,大家要生成告诉,是怎么样体统的,然后在从xml获取数据.

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <html>
 <Head>
        <style type="text/css">

          body {
          background:#fff;
          margin:0;
          padding:40px 20px;
          font-family: "Arial", Arial, Sans-serif;
          font-size: 16px;
          color:#000;
          }

          table {
          margin:5px 5px 0;
          border:0px solid #222;
          font-size: 0.8em;
          }

          td {
          margin:5px 5px 0;
          padding:10px 10px 10px 10px;
          vertical-align:text-top;
          border:1px solid #222;
          border-width:1px 1px 1px 1px;
          }

          td.light {
          border:0px solid #222;
          }

          td.number {
          text-align:right;
          }

          td.status {
          text-align:right;
          vertical-align:text-bottom;
          }

        </style>


 </Head>
 <body>
   <!--OVER RESULT -->
   <xsl:variable name="OVER_STATUS" select="REPORT/OVER_STATUS"/>
   <xsl:variable name="STATUS" select="REPORT/LOG_ENTRY/STATUS"/>



   <h2>自动化测试执行报告</h2>
   <!--table -->
   <table border="1">
     <!--all result value-->
     <tr bgcolor="white" height = "35">
        <td>Overall Test Result</td>
        <td><xsl:value-of select="$OVER_STATUS"/></td>
        <td colspan="2"> </td>
     </tr>

     <tr bgcolor="#D8BFD8" height = "35">
       <th>执行时间</th>
       <th>单步结果</th>
       <th>响应CODE</th>
       <th>Response信息</th>
     </tr>



       <!--select font color -->
       <xsl:variable name="fontColor">
           <xsl:choose>
               <xsl:when test="$STATUS = FAILED or $STATUS = PASSED">
                   <xsl:text>white</xsl:text>
               </xsl:when>
               <xsl:otherwise>black</xsl:otherwise>
           </xsl:choose>
       </xsl:variable>

       <!--background color-->
       <xsl:variable name="backgroundColor">
           <xsl:choose>
               <xsl:when test="$STATUS = 'FAILED'">
                   <xsl:text>rgb(255,0,0)</xsl:text>
               </xsl:when>
               <xsl:when test="$STATUS = 'PASSED'">
                   <xsl:text>rgb(60,179,113)</xsl:text>
               </xsl:when>
               <xsl:otherwise>
                   <xsl:text>white</xsl:text>
               </xsl:otherwise>
           </xsl:choose>
       </xsl:variable>

       <!--log entry-->
       <xsl:for-each select = "REPORT/LOG_ENTRY">


           <tr>
               <td><xsl:value-of select="EXECUTION_TIME"/></td>
               <td bgcolor="{$backgroundColor}"><xsl:value-of select="STEP_RESULT"/></td>
               <td><xsl:value-of select="COMPONENT_NAME"/></td>
               <td><xsl:value-of select="STEP_DESCRIPTION"/></td>
           </tr>
       </xsl:for-each>

       <tr bgcolor="white">
           <font color="{$fontColor}">
               <td colspan="4">Overall Test Result:<xsl:value-of select="$OVER_STATUS"/></td>
           </font>
       </tr>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

xml是要奉公守法,xslt定制的组织举行转移,只怕换句话说,xslt样式要安份守己xml结构去做

xml结构

REPORT/LOG_ENTRY

REPORT下OVER_STATUS节点,那几个是百分百报告的结果,唯有当全体条条框框为passed时才会为passed

每个LOG_ENTBMWX三Y节点,代表1行数据

包括:

STATUS单行数据实市场价格况

EXECUTION_TIME实施时间

STEP_RESULT单步实行结果

COMPONENT_NAME组件名称,

STEP_DESC昂CoraIPTION步骤描述

 

当然那个都可以自已定义,能够友善增添或减弱,不过xslt表中也要相呼应的加码或回落

<?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet href="LOG.XSLT" type="text/xsl"?>
    <REPORT>
        <OVER_STATUS>PASSED</OVER_STATUS>
        <LOG_ENTRY>
            <STATUS>FAILED</STATUS>
            <EXECUTION_TIME>2017.06.15 15:57:16</EXECUTION_TIME>
            <STEP_RESULT>FAILED</STEP_RESULT>
            <COMPONENT_NAME>704</COMPONENT_NAME>
            <STEP_DESCRIPTION>{u'nextUrl': u'http://www.elong.com', u'message': u'\u9a8c\u8bc1\u7801\u9519\u8bef', u'code': u'704', u'success': False, u'isShowVerifyCode': True}</STEP_DESCRIPTION>
        </LOG_ENTRY>
        <LOG_ENTRY>
            <STATUS>FAILED</STATUS>
            <EXECUTION_TIME>2017.06.15 15:57:16</EXECUTION_TIME>
            <STEP_RESULT>FAILED</STEP_RESULT>
            <COMPONENT_NAME>704</COMPONENT_NAME>
            <STEP_DESCRIPTION>{u'nextUrl': u'http://www.elong.com', u'message': u'\u9a8c\u8bc1\u7801\u9519\u8bef', u'code': u'704', u'success': False, u'isShowVerifyCode': True}</STEP_DESCRIPTION>
        </LOG_ENTRY>
    </REPORT>

 

下边上,生成xml的python代码,这一个创立xml结构就很轻便了.

运用xml.dom.minidom就足以了,驾驭多少个要点很轻便就创办三个xml

一,创制三个xml文书档案

import xml.dom.minidom as xmlDoc  #xmlDoc起的别名

xmldoc = xmlDoc.Document

 

贰.因为我们要采取xslt样式,所以呢.

创设的xml第三行是xml头    <?xml version=”壹.0″ encoding=”utf-捌”?>
那样python暗许已经有了,就不用大家创设了,那么

其次行,我们要写样式头 <?xml-stylesheet href=”LOG.XSLT”
type=”text/xsl”?>   头中写了引用一样目录下的LOG.XSLT ,类型TEXT/XSL

要留意一点href属性不要写成这么D:\demo\LOG.XSLT
那样写会极度,只要把那个文件和xml放在同样目录就好了.

            #xml样式
            xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"LOG.XSLT\" type=\"text/xsl\"")
            xmlD.appendChild(xlstNode)

3.创设1个REPORT根节点,你也足以起名ROOT,叫什么名字看你协和了

创办节点用,createElement,之后用appendChild增添节点到xml对象

            report = xmlD.createElement('REPORT')
            xmlD.appendChild(report)

4.之后创建别的节点,一样用createElement,然则假使节点下要加进内容要用xmlDoc.createTextNode(‘passed’)

以下代码意思是:成立贰个over_status的节点,节点文本为passed,然后,将此节点扩张到根节点REPORT下

            overStatus = xmlD.createElement('OVER_STATUS')
            overStatus.appendChild(xmlD.createTextNode('PASSED'))
            report.appendChild(overStatus)

 图片 1

有以上肆点,基本创设三个xml未有失水准了.

 

 

 生成xml具体python代码:

以下代码创制根节点做为了二个独自的函数,之所以这么做因为要扭转的报告,只创制三个根节点,和over_status
结果境况

别的累加的行放在了节点LOG_ENTEscortY下,1个根节点下能够有八个LOG_ENTRY节点……..一个LOG_ENTBMWX三Y节点代码一行数据施行结果

#*_*coding:utf-8*_*

import xml.dom.minidom as xmlDoc
import os
import gl
import sys



class cREPORTXML(object):
    def __init__(self):
        self.__struct = self.createReportNode()

    #创建report节点
    def createReportNode(self):
        try:
            xmlD = xmlDoc.Document()

            #xml样式
            xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"LOG.XSLT\" type=\"text/xsl\"")
            xmlD.appendChild(xlstNode)

            report = xmlD.createElement('REPORT')
            xmlD.appendChild(report)

            overStatus = xmlD.createElement('OVER_STATUS')
            overStatus.appendChild(xmlD.createTextNode('PASSED'))
            report.appendChild(overStatus)

            returnResult = []
            returnResult.append(xmlD)
            returnResult.append(report)
        except Exception,ex:
            return ex.message
        return returnResult


    def writeReport(self,execTime,stepResult,comName,stepDisc):
        #reportNodeList = self.createReportNode()

        entry = self.createLogEntry(self.__struct[0],execTime,stepResult,comName,stepDisc)
        self.__struct[1].appendChild(entry)
        self.writeXml(self.__struct[0],gl.reporterPath+'reportxml.xml')
        #self.writeXml(self.__struct[0],gl.reporterPath+'reportxml_%s.xml'%(gl.curTimeStr))
 #-------------创建xml格式-有多个相同的节点,并且该节点下有4个名称相同的子节点----------------
    def createLogEntry(self,docObj,executeTime,stepResult,componentName,stepDiscription):
        entry = docObj.createElement("LOG_ENTRY")

        status = docObj.createElement("STATUS")
        nodeExecuteTime = docObj.createElement("EXECUTION_TIME")
        nodeStepResult = docObj.createElement("STEP_RESULT")
        nodeComponentName = docObj.createElement("COMPONENT_NAME")
        nodeStepDiscription = docObj.createElement("STEP_DESCRIPTION")

        status.appendChild(docObj.createTextNode(stepResult))
        nodeExecuteTime.appendChild(docObj.createTextNode(executeTime))
        nodeStepResult.appendChild(docObj.createTextNode(stepResult))
        nodeComponentName.appendChild(docObj.createTextNode(componentName))
        nodeStepDiscription.appendChild(docObj.createTextNode(stepDiscription))

        entry.appendChild(status)
        entry.appendChild(nodeExecuteTime)
        entry.appendChild(nodeStepResult)
        entry.appendChild(nodeComponentName)
        entry.appendChild(nodeStepDiscription)
        return entry


    #参数,xml对象,准备存储xml文件路径,文件模式:读 and 写 (r and w)
    def writeXml(self,xmlDoc,xmlPath):
        f = open(xmlPath,"w")
        xmlDoc.writexml(f,indent='\t', addindent='\t', newl='\n', encoding="utf-8") #中间的加了一些格式符,这样生成的xml自动对齐格式
        f.close()




if __name__=='__main__':
    reportx =cREPORTXML()
    print  reportx.writeReport('20170602','PASSED','1-SETTEXT','AUTOMATION TEST')
    print  reportx.writeReport('20170606','FIELD','2-SETTEXT','AUTOMATION TEST')

 

 用ie展开xml报告,当然可以看看总括果展现有点难点,那些不影响报告突显,代码中管理一下就好.

简轻巧单的告诉就马到成功了,追求完美的能够在细化一下,扩张部分别样音信,调度一下颜色.

图片 2

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图