【问题标题】:simplexml_load_string equivalent Python / Djangosimplexml_load_string 等效 Python / Django
【发布时间】:2010-06-27 18:30:21
【问题描述】:

我正在尝试在 Python 中找到一个 xml-interpret 函数(如 simplexml_load_string),但没有成功:/

假设我在一个字符串中有 xml

my_xml_string = """
<root>
      <content>
        <one>A value</one>
        <two>Here goes for ...</two>
      </content>
</root>"""

要读取 php 中的值,我通常会这样做

// read into object
$xml = simplexml_load_string(my_xml_string);

// print some values
echo $xml->root->content->one
echo $xml->root->content->two

在 python/django 中是否有任何等效的对象?

谢谢

【问题讨论】:

    标签: python xml django simplexml


    【解决方案1】:

    最近的可能是ElementTree,它是python标准库的一部分(或扩展版本lxml

    import  xml.etree
    
    element =  xml.etree.ElementTree.XML(my_xml_string)
    

    设置 Element 类的元素,可以将其视为 XML 元素列表

    例如

    # for your example
    print(element[0][0].tag)
    print(element[0][0].text)
    print(element[0][3].text)
    

    如果您想使用名称,也可以通过 XPath 进行搜索。

    lxml 还有一个objectify 模型,它允许像“处理普通的Python 对象层次结构一样”访问元素。哪个更符合 php 用法

    【讨论】:

    • 嗯 xml.dom.minidom 怎么样?
    • 你可以使用它——但是你正在操作一个 DOM——lxml 和元素树试图使导航更“pythonic”而不是 DOM 特定
    【解决方案2】:

    lxml.objectify 完全符合您的要求

    In [1]: from lxml import objectify
    
    In [2]: x = objectify.fromstring("""<response><version>1.2</version><amount>1.01</amount><currency>USD</currency></response>""")
    
    In [3]: x.version
    Out[3]: 1.2
    
    In [4]: x.amount
    Out[4]: 1.01
    
    In [5]: x.currency
    Out[5]: 'USD'
    

    【讨论】:

      【解决方案3】:

      Python standard library 包含多个 xml 解析模块。可能最简单的是 ElementTree。

      from xml.etree import cElementTree as ET
      xml = ET.fromstring(my_xml_string)
      
      print xml.find('.//content/one').text
      print xml.find('.//content/two').text
      

      【讨论】:

        【解决方案4】:

        ElementTree 很常见,可能是 Python 中包含的最好的库(自 2.5 版以来)。

        但是,我个人更喜欢lxml 的功能和灵活性。 “lxml.objectify”方法对于将大型 XML DOM 解析为 Python 对象特别有用。

        【讨论】:

        • 我不太喜欢 ElementTree,也许我对语法有点不习惯。 xml.dom.minidom 对我来说似乎更完整。我一定会调查lxml!谢谢!
        • minidom 是最简单的,但也是最少 pythonic 和功能最不完整的。我以前用它来完成这项工作,但如果你花很多时间处理 XML,你很快就会放弃它。
        【解决方案5】:

        从 xml.dom.minidom 导入 *

        my_xml_string = """
        <root>
              <content>
                <one>A value</one>
                <two>Here goes for ...</two>
              </content>
        </root>"""
        
        xml = parseString(xml_string)
        result = xml.getElementsByTagName('one')[0].firstChild.data
        

        现在就成功了!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-17
          • 1970-01-01
          • 1970-01-01
          • 2014-10-21
          • 2023-04-09
          • 2012-05-07
          • 2011-07-15
          • 1970-01-01
          相关资源
          最近更新 更多