【问题标题】:xml/parse: Convert all tag names into lower case and remove empty rowxml/parse:将所有标签名称转换为小写并删除空行
【发布时间】:2015-10-29 00:21:45
【问题描述】:

我有一个凌乱的 XML 文件,想通过以下方式对其进行标准化:

  1. 将所有标签名称转换为小写。比如将<ROW><Year>转换成<row><year>

  2. 删除空行,例如<ROW> 之后和</ROW> 标记之前的空格。

我可以在BeautifulSoup 中调用:

soup = BeautifulSoup(xml_str_update, "lxml")

但是,一旦文件大于一定大小,BeautifulSoup 就会开始抱怨...

Exception MemoryError: MemoryError() in 'lxml.etree._BaseErrorLog._receive' ignored

所以,我想知道这是否可以使用其他库来完成。提前致谢!

我的 xml 文件示例:

xml_str = """
<DATA>

    <ROW>
        <assmtid>1</assmtid>
        <Year>1988</Year>
    </ROW>

    <ROW>
        <assmtid>2</assmtid>
        <Year>1989</Year>
    </ROW>

    <ROW>
        <assmtid>2</assmtid>
        <Year>1990</Year>
    </ROW>

</DATA>
"""

【问题讨论】:

    标签: xml parsing beautifulsoup lxml


    【解决方案1】:

    XSLT 是您的朋友。您已经描述了两个转换规则:

    1. 将所有标签名称转换为小写。例如,将&lt;ROW&gt;&lt;Year&gt; 转换为&lt;row&gt;&lt;year&gt;

    那是:

    <xsl:template match="*">
      <xsl:element name="{lower-case(name())}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:template>
    
    1. 删除空行,例如&lt;ROW&gt; 之后和&lt;/ROW&gt; 标记之前的空格。

    这很简单

    <xsl:strip-space elements="ROW"/>
    

    (或者您可以扩展您希望它应用到的元素列表:elements="*" 将从所有元素中去除纯空格文本节点)。

    如果您的文档超过几百 Mb,那么它将受益于流式传输,这在几个 XSLT 3.0 处理器中可用 - Saxon-EE 和 Exselt。

    【讨论】:

    • 非常感谢您的建议!
    猜你喜欢
    • 2014-06-09
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2013-05-02
    • 2012-03-05
    • 2022-06-10
    • 2019-11-26
    相关资源
    最近更新 更多