【问题标题】:text between two xml tags [closed]两个 xml 标签之间的文本 [关闭]
【发布时间】:2014-09-15 06:06:06
【问题描述】:

我想使用 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,但我无法提出解决方案。谢谢!

【问题讨论】:

  • 您如何访问这些 xml 标签?它们是否存储在文本文件中?或者它们是否可以在 python 中表示为字符串?附带说明一下,SO 上的大多数人都希望看到您首先尝试使用一些示例代码或至少是伪代码来解决编程问题。
  • 是的,它们存储在文本文件中。我正在尝试解决问题,但建议使用哪些工具会非常有用
  • ...如果在 Python 中,请使用您选择的 XML 解析库;在 lxml 中,f'rinstance,tree.xpath('//Name/Words//text()') 将返回 Words 标签下的所有文本节点(字符串)。
  • @user3750474 您是否介意我通过将&lt;Z 2="x"&gt;I&lt;/Z&gt; 更改为&lt;Z x="2"&gt;I&lt;/Z&gt; 甚至更改为&lt;Z&gt;I&lt;/Z&gt; 来使您的XML 正确XML 文档,因为属性与问题的核心无关?

标签: python xml regex shell


【解决方案1】:

使用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 标准库的一部分。但是,它提供了很多实用的 functins(更好的 XPath,针对模式的验证......),值得安装(我认为 lxml 我的 Python 环境的标准部分)。

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

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

【讨论】:

    【解决方案2】:

    这是一个使用xml.etree.ElementTreehttps://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 的工作原理。

    【讨论】:

    • 这不适用于 OP 提供的输入。 ElementTree 说这是一个无效的 XML 文档。
    • 哈哈是的,这就是我编辑他的 XML 的原因。如果 OP 的 XML 格式不正确,则应在尝试解析之前解决。
    • @alecxe, ...因为 OP 提供的输入根本不是 XML。可以安全地假设——当 OP 明确声称他们正在使用 XML 时,就像这里一样——输入的匿名性很差,而不是需要处理不是 XML 的内容。
    • @CharlesDuffy 是的,这就是为什么我认为这两个答案都不足以在这里声称有帮助。更改 OP 的输入对于 SO 来说确实不是一个好习惯 :)
    • @alecxe 那么您打算提供什么作为答案呢?为真正损坏的 XML 文档提供解析器?还是以不清楚的方式结束问题?对我来说,这两种选择似乎都没有用。纠正损坏的输入是答案的一部分,然后使用它。
    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多