从XML中提取值

3

非常业余的程序员在这里,希望得到你的帮助。

我经常需要编辑像这样的xml文件

    --- blah blah blah plenty xml stuff above ---
    <lex marker="mala" sentiment="negative"/>
    <lex marker="malas" sentiment="negative"/>
    <lex marker="maleducad\p{Ll}*" sentiment="negative" regex="true"/>
    <lex marker="mali\p{Ll}+sima\p{Ll}*" sentiment="negative" regex="true"/>
    <lex marker="mali\p{Ll}+simo\p{Ll}*" sentiment="negative" regex="true"/>
    --- blah blah blah plenty xml stuff below ---

通过使用相当复杂的正则表达式搜索和替换过程,我只能提取标记属性的值。(这是我关心的全部内容)。
但这很耗时间,必须有一种在Python中查找属性marker="SOME_TEXT"的相当简单的方法,并将所有值放入一个数组中,然后之后再将该数组打印到文件中。但我无法想出解决方法:(
我正在寻找一种不需要导入任何XML库的方法,因为我希望将它保持尽可能简单(和合乎逻辑),让我的业余编程思维从中学习,并且我只对特定属性的数据感兴趣,我并不关心文件的其余部分(或其XML属性)。
我之所以询问Python是因为我认为这是一种我热衷于学习的语言。但如果你知道一种Linux终端的方法来处理它(如sed、awk等),我也很高兴采用那种方式。

2
请使用XML解析器。 - squiguy
1个回答

4

使用正则表达式匹配XML会变得太复杂,太快了。你真的不应该这样做

相反,应该使用XML解析器,Python有几个可供选择:

  • ElementTree是标准库的一部分
  • lxml是一个快速且功能丰富的基于C的库。

ElementTree示例:

from xml.etree import ElementTree

tree = ElementTree.parse('filename.xml')
for elem in tree.findall('lex'):
    print elem.attrib['marker']

非常感谢。但是如果将来发送给我的一堆文件不是XML文件怎么办?因此最好有一个编程过程,可以查找特定的文本块,并保留该文本块之间的所有内容。 - aName
1
如果将来你收到一堆不是XML文件的文件,你需要调整你的代码。现在你得到的是XML,而XML解析器是正确的工具。如果你收到的是JSON数据呢?你的正则表达式也无法匹配那种格式的数据。 - Martijn Pieters
好的,公平。给你点个赞。谢谢。 - aName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接