两个XML标签之间的文本

-2 投票
2 回答
2285 浏览
提问于 2025-04-18 14:30

我想用shell或者python命令来获取两个xml标签之间的文本。比如输入:

<Name input="sentence">
    <Words>
        <Z 2="x">I</Z>
        <Z 2="x">like</Z>
        <Z 2="x">to</Z>
        <Z 2="x">eat</Z>
        <Z 2="x">food</Z>
     </Words>
</Name>
<Name input="sentence">
    <Words>
        <Z 2="x">Sam's</Z>
        <Z 2="x">food</Z>
        <Z 2="x">is</Z>
        <Z 2="x">best</Z>
    </Words>
</Name>

我希望输出是:

I like to eat food
Sam's food best

基本上,标签表示一个新句子的开始,而标签则是我想用来重构这个句子的词。我有很多这样的句子。有什么建议吗?我在考虑使用sed或者python里的re类,但我想不出解决办法。谢谢!

2 个回答

0

这里有一个简单的例子,使用的是 xml.etree.ElementTree 库,详细信息可以查看这个链接:https://docs.python.org/2/library/xml.etree.elementtree.html#

输入文件是 inputxml.xml

<?xml version="1.0"?>
<Name input="sentence">
    <Words>
        <Z>I</Z>
        <Z>like</Z>
        <Z>to</Z>
        <Z>eat</Z>
        <Z>food</Z>
    </Words>
</Name>

这个程序文件叫做 XMLParseWords.py

import xml.etree.ElementTree as ET

XML_file = 'inputxml.xml'
tree = ET.parse(XML_file)
root = tree.getroot()
outputString = ""
for word in root.findall('./Words/Z'):
    outputString += word.text + " "
print outputString    

当你运行这个程序时,它会输出 I like to eat food。只要你了解你正在解析的 XML 文件的结构,提取你需要的元素应该是比较简单的。我建议你先阅读我之前提到的 pydoc,这样可以帮助你理解 xml.etree.ElementTree 是怎么工作的。

3

使用 lxml 的 XPath

我们已经修正了文件 "xmldoc.xml" 中的 XML 文档:

<?xml version="1.0"?>
<root>
  <Name input="sentence">
    <Words>
      <Z>I</Z>
      <Z>like</Z>
      <Z>to</Z>
      <Z>eat</Z>
      <Z>food</Z>
    </Words>
  </Name>
  <Name input="sentence">
    <Words>
      <Z>Sam's</Z>
      <Z>food</Z>
      <Z>is</Z>
      <Z>best</Z>
    </Words>
  </Name>
</root>

现在我们可以在解析后的文档上使用 xpath

>>> from lxml import etree
>>> for word in etree.parse("xmldoc.xml").xpath("//Words"):
...     print " ".join(word.xpath(".//Z/text()"))
...
I like to eat food
Sam's food is best

评论

  • 原始的 XML 在提问者那里是有问题的,属性名不能以数字开头。

  • lxml 需要单独安装,它不是 Python 自带的库。不过,它提供了很多实用的功能(比如更好的 XPath 支持、可以根据模式进行验证等),所以安装它是值得的。我把 lxml 视为我 Python 环境中的标准部分。

  • etree.parse 可以解析文件类型的对象或者作为参数传入的文件内容。

  • .xpath("//Words") 是必要的,它可以将句子分成不同的组。
  • word.xpath(".//Z/text()") 中的点是很重要的,它告诉 XPath 要相对于当前元素来评估这个表达式。

撰写回答