【问题标题】:Remove xml tag using python if a certain text is found如果找到某个文本,则使用 python 删除 xml 标签
【发布时间】:2022-01-19 01:40:21
【问题描述】:

如果找到某个文本,我需要从 xml 文档中删除所有标签。

例子:

<root-element>
    <tag-name first:line="some-value">bla-bla</tag-name>
    <tag-name second:line="some-value">bla-bla</tag-name>
    <tag-name third:line="some-value">bla-bla</tag-name>
    <tag-name first:line="some-value">bla-bla</tag-name>
    <tag-name second:line="some-value">bla-bla</tag-name>
</root-element>

所以对于 XML 文档中的每个first:line,我想删除整个标签。

【问题讨论】:

  • 如何使用 XSLT 完成任务?
  • 您的 XML 格式不正确。它缺少一个根元素。请修复它。
  • 所提供的 XML 还有一个问题。它为每个属性使用命名空间(first:, second:, etc.)。我不确定这是否是真实的场景。它看起来像一个模糊的 XML。请编辑您的问题并提供真实的 XML。

标签: python xml


【解决方案1】:

您需要使用 xml 解析库。

我推荐 lxml。

然后使用 text() 属性上的函数 string-length() 构建 xpath 选择器。这样它将选择任何内部带有文本的元素。

import lxml.etree as et

tree=et.fromstring(xml)

for bad in tree.xpath("//*[string-length(text()) > 0]"):
  bad.getparent().remove(bad)   

print(et.tostring(tree, pretty_print=True, xml_declaration=True))

【讨论】:

  • 感谢 João A. Veiga。迭代时我应该将“first:line”放在 xpath 的哪个位置?
  • 我不确定我是否理解您要执行的操作,您只想删除具有 first:line 属性的标签吗?在这种情况下,Xpath 将是: //*[string-length(text()) > 0 and @first:line]"
【解决方案2】:

这里是如何通过 XSLT 来实现的。

XSLT 使用所谓的身份转换模式。

我修改了 XML 并删除了虚假的命名空间。

输入 XML

<?xml version="1.0"?>
<root-element>
    <tag-name firstline="some-value">bla-bla</tag-name>
    <tag-name secondline="some-value">bla-bla</tag-name>
    <tag-name thirdline="some-value">bla-bla</tag-name>
    <tag-name firstline="some-value">bla-bla</tag-name>
    <tag-name secondline="some-value">bla-bla</tag-name>
</root-element>

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[@firstline]"/>
</xsl:stylesheet>

输出 XML

<root-element>
  <tag-name secondline="some-value">bla-bla</tag-name>
  <tag-name thirdline="some-value">bla-bla</tag-name>
  <tag-name secondline="some-value">bla-bla</tag-name>
</root-element>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2014-12-01
  • 2019-12-02
相关资源
最近更新 更多