从已解析的 xml 文本中提取值

Extracting values from parsed xml text

我正在使用 lxml 解析以下 XML 文本块:

<block>{<block_content><argument_list>(<argument><expr><name><name>String</name><operator>.</operator><name>class</name></name></expr></argument>, <argument><expr><name><name>Object</name><operator>.</operator><name>class</name></name></expr></argument>)</argument_list></block_content>}</block> 
<block>{<block_content><argument_list>(<argument><expr><literal type="string">"Expected exception to be thrown"</literal></expr></argument>)</argument_list></block_content>}</block> 
<block>{<block_content></block_content>}</block> 

我的要求是从上面的 xml 片段中打印以下内容:

  1. String.class
  2. Object.class
  3. "Expected exception to be thrown"

基本上,我需要打印 xml 代码段的 argument 节点中包含的文本值。

下面是我正在使用的代码块。

from lxml import etree

xml_text = '<unit>' \
           '<block>{<block_content><argument_list>(<argument><expr><name><name>String</name><operator>.</operator><name>class</name></name></expr></argument>, <argument><expr><name><name>Object</name><operator>.</operator><name>class</name></name></expr></argument>)</argument_list></block_content>}</block> ' \
           '<block>{<block_content><argument_list>(<argument><expr><literal type="string">"Expected exception to be thrown"</literal></expr></argument>)</argument_list></block_content>}</block> ' \
           '<block>{<block_content></block_content>}</block>' \
           '</unit>'

tree = etree.fromstring(xml_text)

args = tree.xpath('//argument_list/argument')
for i in range(len(args)):
    print('%s. %s' %(i+1, etree.tostring(args[i]).decode("utf-8")))

但是,此代码产生的以下输出不符合我的要求。

1. <argument><expr><name><name>String</name><operator>.</operator><name>class</name></name></expr></argument>, 
2. <argument><expr><name><name>Object</name><operator>.</operator><name>class</name></name></expr></argument>)
3. <argument><expr><literal type="string">"Expected exception to be thrown"</literal></expr></argument>)

如果有人能指出我需要对我的代码进行哪些修改,我将不胜感激

我发现 strip_tags 函数可以完成工作。以下是更新后的代码:

for i in range(len(args)):
    etree.strip_tags(args[i], "*")
    print('%s. %s' %(i+1, args[i].text))

更新代码的输出:

  1. String.class
  2. Object.class
  3. "Expected exception to be thrown"