我有以下xml:
<?xml version="1.0" encoding="utf-8"?>
<autostart version="2.0">
<FileState>0</FileState>
<FileTemplate clsid="{6F6FBFC1-3F14-46CA-A269}">
<properties>
<obj name="TypeSettings" clsid="{6F6FBFC1-3F14-46CA-A269}">
<properties>
<prop name="Enumerator" type="8">en0</prop>
<prop name="Name" type="8">en0</prop>
<prop name="Type" type="3">1</prop>
</properties>
</obj>
<obj name="GeneralSettings" clsid="{6F6FBFC1-3F14-46CA-A269}">
<properties>
<prop name="BufferSize" type="21">524288000</prop>
<prop name="FilePattern" type="8">auto_eth0</prop>
<prop name="FileSize" type="21">1048576</prop>
<prop name="MaxFileAge" type="11">-1</prop>
<prop name="MaxTotalFileSize" type="11">0</prop>
<prop name="Name" type="8">auto-en0</prop>
<prop name="Owner" type="8">root</prop>
</properties>
</obj>
</properties>
</FileTemplate>
</autostart>
我想在'GeneralSettings'下获取属性的属性值,我尝试了以下代码,但对我不起作用。是否有更容易使用的解析器?
>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse("test.xml")
>>> doc = tree.getroot()
>>>
>>> for elem in doc.findall('autostart/FileTemplate/properties/obj/properties/prop'):
... print elem.get('name="BufferSize"'), elem.text
...
>>>
答案 0 :(得分:0)
我最熟悉BeautifulSoup
,这很简单:
from bs4 import BeautifulSoup
with open('test.xml') as f:
soup = BeautifulSoup(f)
gs = soup.find(attrs={'name':'GeneralSettings'})
for prop in gs.findAll('prop'):
print(prop.text)
524288000
auto_eth0
1048576
-1
0
auto-en0
root
这并不是说bs4
是python中xml解析的最终结果,它只是一个非常友好的API。
答案 1 :(得分:0)
BeautifulSoup非常适合这个!
import bs4
wanted = "BufferedSize"
#doc = your html string
soup = bst.BeautifulSoup(doc)
#get all prop inside properties
props = soup.findall('prop')
for prop in props:
name = prop["name"]
if name == wanted:
print prop["name"], prop.text
如果您需要任何解释,请告诉我们。
答案 2 :(得分:0)
您的问题是您在搜索路径中有autostart
,那是您的根。如果您将该行修改为:
for elem in doc.findall('FileTemplate/properties/obj[@name="GeneralSettings"]/properties/prop[@name="BufferSize"]'):
print elem.text
应该按预期工作。
答案 3 :(得分:0)
问题出在路径表达式中。在这里我的尝试:
import xml.etree.ElementTree as ET
doc = ET.parse('test.xml')
for prop_node in doc.iterfind('FileTemplate/properties/obj[@name="GeneralSettings"]/properties/prop[@name="BufferSize"]'):
print 'Name:', prop_node.get('name'),
print 'Type:', prop_node.get('type'),
print 'Text:', prop_node.text
名称:BufferSize类型:21文字:524288000
.get()
方法获取每个属性,或者您可以使用.items()
方法获取所有这些属性。