Я не могу контролировать качество 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.
Моя обычная рекомендация - предварительно обработать его, чтобы нормализовать пространства имен. Это имеет два преимущества: код нормализации очень многократно используется, поскольку он не зависит от того, как данные обрабатываются впоследствии; и логика для обработки данных значительно упрощена.
Если в документах используется только одно пространство имен или нет, и не используйте квалифицированные имена в содержимом текстовых или атрибутных узлов, то преобразование для достижения этой нормализации очень просто:
<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>