【问题标题】:XML parsing specific values - PythonXML 解析特定值 - Python
【发布时间】:2014-09-09 19:35:56
【问题描述】:

我一直在尝试解析 xml 文件列表。我想打印特定的值,例如 userName 值。

<?xml version="1.0" encoding="utf-8"?>
<Drives clsid="{8FDDCC1A-0C3C-43cd-A6B4-71A6DF20DA8C}" 
        disabled="1">
  <Drive clsid="{935D1B74-9CB8-4e3c-9914-7DD559B7A417}" 
         name="S:" 
         status="S:" 
         image="2" 
         changed="2007-07-06 20:57:37" 
         uid="{4DA4A7E3-F1D8-4FB1-874F-D2F7D16F7065}">
    <Properties action="U" 
                thisDrive="NOCHANGE" 
                allDrives="NOCHANGE" 
                userName="" 
                cpassword="" 
                path="\\scratch" 
                label="SCRATCH" 
                persistent="1" 
                useLetter="1" 
                letter="S"/>
  </Drive>
</Drives>

我的脚本工作正常,收集 xml 文件列表等。但是下面的功能是打印相关值。我正在尝试按照post 中的建议实现这一目标。但是我显然做错了什么,因为我收到错误提示elm 对象没有属性text。任何帮助将不胜感激。

当前代码

from lxml import etree as ET

def read_files(files):
    for fi in files:
        doc = ET.parse(fi)
        elm = doc.find('userName')
        print elm.text

【问题讨论】:

    标签: python xml


    【解决方案1】:

    doc.find 查找具有给定名称的 标签。您正在寻找具有给定名称的属性

    elm.text 给你一个错误,因为doc.find 没有找到任何标签,所以它返回None,它没有text 属性。

    多阅读一些 lxml.etree 文档,然后尝试以下方法:

    doc = ET.parse(fi)
    root = doc.getroot()
    prop = root.find(".//Properties") # finds the first <Properties> tag anywhere
    elm = prop.attrib['userName']
    

    【讨论】:

    • 嗯?属性挂起的不是根。
    • 你说的很对,我把答案改成了寻找Properties标签的属性。
    【解决方案2】:

    userName 是一个属性,而不是一个元素。属性根本没有附加文本节点。

    for el in doc.xpath('//*[@userName]'):
      print el.attrib['userName']
    

    【讨论】:

    • 您能解释一下//*[@userName] 的值吗?我想了解如何添加多个属性。
    • @iNoob,您应该阅读etree 文档,了解如何使用类似 XPath 的规范来查找具有特定属性的标签:docs.python.org/2/library/…
    • @DanLenski,...哦,这是一个公平的反对意见——我在这里使用的是真正的 XPath;在实践中,我使用 lxml.etree,而不是标准库 ElementTree。
    • @DanLenski,...实际上,重新阅读问题,OP 正在使用 lxml.etree,所以这实际上是一个公平的选择。 :)
    • @iNoob, @userName 的意思是“有一个名为 userName 的属性”。 // 进行递归搜索。 * 匹配任意名称的元素。也就是说,如果您知道具有所需属性的元素将始终称为 Properties,那么您无需搜索它具有哪些属性。
    【解决方案3】:

    您可以尝试使用标签名称获取元素,然后尝试获取其属性(userNameProperties 的属性):

    from lxml import etree as ET
    
    def read_files(files):
        for fi in files:
            doc = ET.parse(fi)
            props = doc.getElementsByTagName('Properties') 
            elm = props[0].attributes['userName']
            print elm.value
    

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多