两个xml标签之间的文本

时间:2014-07-23 21:04:07

标签: python xml regex shell

我想使用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

基本上,标签指定新句子的开头,并指定我想用它重建的单词。我有很多这样的句子。有什么建议?我在考虑在python中使用sed或re class,但我无法想出解决方案。谢谢!

2 个答案:

答案 0 :(得分: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

评论

  • OP中的原始XML被破坏,不允许属性以数字开头。

  • lxml将被安装,它不是Python stdlib的一部分。但是,它提供了许多实用的功能 functins(更好的XPath,对模式的验证......),值得安装(我考虑一下) 我的Python环境的lxml标准部分。)

  • etree.parse能够解析文件类对象或作为参数传递的文件内容。

  • .xpath("//Words")是将句子分成不同群体的必要条件。
  • word.xpath(".//Z/text()")处的点很重要,它指示XPath评估表达式 相对于当前元素。

答案 1 :(得分: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的工作原理。