Пространство имен ElementTree неудобство - PullRequest
1 голос
/ 23 февраля 2011

Я не могу контролировать качество получаемого 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 Ответ

1 голос
/ 23 февраля 2011

Моя обычная рекомендация - предварительно обработать ее, чтобы нормализовать пространства имен. Это имеет два преимущества: код нормализации можно многократно использовать, поскольку он не зависит от того, как данные обрабатываются впоследствии; логика обработки данных значительно упрощена.

Если в документах используется только одно это пространство имен или нет, и не используются квалифицированные имена в содержимом узлов текста или атрибутов, то преобразование для достижения этой нормализации очень просто:

<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>
...