ElementTree名称空间不便

时间:2011-02-23 16:18:33

标签: python xml lxml elementtree

我无法控制我获得的XML质量。在某些情况下,它是:

<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
...
</COLLADA>

在其他人中我得到:

 <COLLADA>...</COLLADA>

我想我也应该处理

 <collada:COLLADA xmlns:collada="http://www.collada.org/2005/11/COLLADASchema">
 ...
 </collada:COLLADA>

它是完全相同的模式,我只需要一个解析器来处理它。我该如何处理所有这些案件?我需要XPath和其他lxml好东西来解决这个问题。如何在etree.parse时间内使其保持一致?每次我需要使用XPath时,我都不想检查命名空间。

1 个答案:

答案 0 :(得分:1)

我通常建议首先对其进行预处理,以规范化命名空间。这有两个好处:规范化代码是高度可重用的,因为它不依赖于随后如何处理数据;并且处理数据的逻辑大大简化了。

如果文档只使用这个名称空间,或者没有,并且不在文本或属性节点的内容中使用限定名称,那么实现此标准化的转换非常简单:

<xsl:template match="*">
  <xsl:element name="local-name()" namespace="http://www.collada.org/2005/11/COLLADASchema">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>