假设我有一个示例配置XML文件,如下所示:
<?xml version="1.0"?>
<note>
<to>Tove</to>
<infoaboutauthor>
<nestedprofile>
<aboutme>
<gco:CharacterString>I am a 10th grader who likes to play ball.</gco:CharacterString>
</aboutme>
</nestedprofile>
</infoaboutauthor>
<date>
<info_date>
<date>
<gco:Date>2003-06-13</gco:Date>
</date>
<datetype>
<datetype attribute="Value">
</datetype>
</datetype>
</info_date>
</date>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
在python中(尝试使用ElementTree,不确定它是否最好)我想获得某些标签的某些值。我试过了:
with open('testfile.xml', 'rt') as f:
tree = ElementTree.parse(f)
print 'Parsing'
root = tree.getroot()
listofelements = root_elem.findall('gco:CharacterString')
for elementfound in listofelements:
print elementfound.text
在我上面使用的代码中,当我收到冒号时它似乎不起作用,因为我收到以下错误:
SyntaxError: prefix 'gco' not found in prefix map
我的目标是
实现这一目标的最佳方法是什么?有没有办法查找“gco:CharacterString”,其中父级等于“aboutme”?或者是否有一些方便的方法可以让它进入一个我可以去mydict['note']['to']['nestedprofile']['aboutme']
的词典?
注意:“gco:”前缀是我必须处理的内容,它是xml的一部分。如果elementtree不适合这个,那没关系。
答案 0 :(得分:1)
首先,您的XML已损坏。第2行中的-
打破了解析器。我也不认为它喜欢gco:
。你可以使用其他一些XML配置吗?或者这是由你无法控制的东西自动生成的?
所以这就是XML使用Python需要的样子:
<?xml version="1.0"?>
<note>
<to>Tove</to>
<infoaboutauthor>
<nestedprofile>
<aboutme>
<CharacterString>I am a 10th grader who likes to play ball.</CharacterString>
</aboutme>
</nestedprofile>
</infoaboutauthor>
<date>
<info_date>
<date>
<Date>2003-06-13</Date>
</date>
<datetype>
<datetype attribute="Value">
</datetype>
</datetype>
</info_date>
</date>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这是实现两个目标的代码:
# Get the element tree from the file name and not a file object
tree = ElementTree.parse('config.xml')
# Get the root of the tree
root = tree.getroot()
# To get the 'Date' tag and print its text
date_tag = root.find('date').find('info_date').find('date').find('Date')
print date_tag.text
# Get the `aboutme` tag and print its text
about_me_tag = root.find('infoaboutauthor').find('nestedprofile').find('aboutme').find('CharacterString')
print about_me_tag.text
<强>更新强>
就处理“gco:”而言,你可以这样做:
def replace_in_config(old, new):
with open('config.xml', 'r') as f:
text = f.read()
with open('config.xml', 'w') as f:
f.write(text.replace(old, new))
然后在执行上述XML操作之前运行:
replace_in_config('gco:', '_stripped')
然后在XMl操作完成后(当然你需要考虑gco:Date
标签现在是stripped_Date
和CharacterString标签这一事实),运行:
replace_in_config('_stripped', 'gco:')
这将保留原始格式,并允许您使用etree
解析它。
答案 1 :(得分:0)
我认为您的XML文档无效,因为尚未定义'gco'命名空间。
作为parse命令的一部分,我无法找到将定义提供给lxml的方法。您可以操作文档来添加定义或删除@ mjgpy3建议的前缀。
另一种方法可能是使用HTML解析器,因为它对它接受的内容要严格得多。但要注意,这会改变数据结构以添加HTML标题等。
from lxml import etree
Parser = etree.HTMLParser()
XMLDoc = etree.parse(open('C:/Temp/Test.xml', 'r'), Parser)
Elements = XMLDoc.xpath('//characterstring')
for Element in Elements:
print Element.text