我有一个凌乱的XML文件,并希望通过以下方式对其进行标准化:
将所有标记名称转换为小写。例如,将<ROW>
,<Year>
转换为<row>
和<year>
删除空行,例如<ROW>
之后和</ROW>
标记之前的空格。
我可以通过调用:{/ p>在BeautifulSoup
中执行此操作
soup = BeautifulSoup(xml_str_update, "lxml")
但是,一旦文件大于特定大小,BeautifulSoup
就会开始抱怨......
Exception MemoryError: MemoryError() in 'lxml.etree._BaseErrorLog._receive' ignored
所以,我想知道是否可以使用其他库来完成。提前谢谢!
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>
"""
答案 0 :(得分:2)
XSLT是你的朋友。您已经描述了两个转换规则:
<ROW>
,<Year>
转换为<row>
和<year>
这&#39; S:
<xsl:template match="*">
<xsl:element name="{lower-case(name())}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<ROW>
之后和</ROW>
标记之前删除空行,例如空格。那只是
<xsl:strip-space elements="ROW"/>
(或者你可以扩展你想要应用的元素列表:elements="*"
将从所有元素中删除仅空白文本节点。)
如果您的文档超过几百Mb,那么它将受益于流式传输,这可以在几个XSLT 3.0处理器中使用 - Saxon-EE和Exselt。