3

dom で XML を生成しました。lxml を使用して xml をきれいに印刷したいと考えています。

これはxmlをきれいに印刷するための私のコードです

def prettify_xml(xml_str):

   import lxml.etree as etree
   root = etree.fromstring(xml_str)
   xml_str =  etree.tostring(root, pretty_print=True)

   return xml_str

出力は xml 形式の文字列である必要があります。

stactoverflow の投稿からこのコードを取得しました。これは、ウィット python 自体をコンパイルしているときに問題なく動作します。しかし、プロジェクトをpy2exeから作成されたバイナリに変換すると(私のバイナリは名前付きパイプを備えたWindowsサービスです)、2つの問題がありました:

  1. サービスが開始されませんでした。py2exe 関数lxml.etreeにオプションを追加することでこれを解決しました。includesその後、私のサービスで適切に開始されました。

  2. ここでxml生成が呼び出されると、ログに表示されるエラーです 'module' object has no attribute 'fromstring'

このエラーはどこで修正すればよいですか? そして、私の最初の問題の解決策は正しいですか?

私のxml生成コード:

from xml.etree import ElementTree
from xml.dom import minidom
from xml.etree.ElementTree import Element, SubElement, tostring, XML 
import lxml.etree 


    def prettify_xml(xml_str):

      root = lxml.etree.fromstring(xml_str)
      xml_str =  lxml.etree.tostring(root, pretty_print=True)

      return xml_str

   def dll_xml(status):
    try:
        xml_declaration = '<?xml version="1.0" standalone="no" ?>'

        rootTagName='response'
        root = Element(rootTagName)
        root.set('id' , 'rp001')

        parent = SubElement(root, 'command', opcode ='-ac')

        # Create children
        chdtag1Name = 'mode'
        chdtag1Value = 'repreport'

        chdtag2Name='status'
        chdtag2Value = status

        fullchildtag1 = ''+chdtag1Name+' value = "'+chdtag1Value+'"'
        fullchildtag2=''+chdtag2Name+' value="'+chdtag2Value+'"'

        children = XML('''<root><'''+fullchildtag1+''' /><'''+fullchildtag2+'''/></root> ''')

        # Add parent
        parent.extend(children)
        dll_xml_doc = xml_declaration + tostring(root)

        dll_xml_doc = prettify_xml(dll_xml_doc)

        return dll_xml_doc

    except Exception , error:
       log.error("xml_generation_failed : %s" % error)
4

1 に答える 1