xml / parse:将所有标记名称转换为小写并删除空行

时间:2015-10-29 00:21:46

标签: xml parsing beautifulsoup lxml

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

  1. 将所有标记名称转换为小写。例如,将<ROW><Year>转换为<row><year>

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

  3. 我可以通过调用:{/ p>在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>
    """
    

1 个答案:

答案 0 :(得分:2)

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

  1. 将所有标记名称转换为小写。例如,将<ROW><Year>转换为<row><year>
  2. 这&#39; S:

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

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

      (或者你可以扩展你想要应用的元素列表:elements="*"将从所有元素中删除仅空白文本节点。)

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