Python 2.5 ElementTree обрабатывает xml-узел с пространством имен

Я использую Python2.5, ElementTree 1.2 для анализа XML-документа, который выглядит так:

<cm:CompositeMessage xmlns:cm="http://www.xyz.com">
    <cm:Message>
        <cm:Body format="text/xml">
            <CHMasterbook >
                    <event>
                            <eventName>Snapshot</eventName>
                            <date>2013-10-25</date>
                            <time>20:59:02</time>
                    </event>
            </CHMasterbook>
         </cm:Body>
     </cm:Message>
</cm:CompositeMessage>

После того, как я зарегистрирую пространство имен

ET._namespace_map['http://www.xyz.com'] = 'cm'

Я могу проанализировать XML-документ и найти узел «событие»

tree = ElementTree(fromstring(xml))
tree.findall('./{http://www.xyz.com}Message/{http://www.xyz.com}Body/CHMasterBook/event')

Но если узел «CHMasterbook» имеет такие пространства имен, как

<CHMasterbook xmlns="http://uri.xyz.com/Chorus/Message" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://uri.xyz.com/Chorus/Message ../schema/chorus-master-book-msg.xsd">

tree.findall возвращает только пустой список и больше не может найти узел «событие». Я также пытался зарегистрировать эти пространства имен, например:

ET._namespace_map['http://uri.xyz.com/Chorus/Message'] = 'xmlns'
ET._namespace_map['http://www.w3.org/2001/XMLSchema-instance'] = 'xmlns:xsi'
ET._namespace_map['http://uri.xyz.com/Chorus/Message ../schema/chorus-master-book-msg.xsd'] = 'xsi:schemaLocationi'

Но это не помогло.

Я могу использовать только Python 2.5 и ElementTree 1.2 (не могу использовать lxml). Кто-нибудь знает, как найти узел «событие» с «CHMasterbook», имеющим эти пространства имен?


person wd113    schedule 24.11.2013    source источник


Ответы (1)


Попробуй это:

tree = ElementTree(fromstring(xml))
tree.findall('./{http://www.xyz.com}Message'
             '/{http://www.xyz.com}Body'
             '/{http://uri.xyz.com/Chorus/Message}CHMasterbook'
             '/{http://uri.xyz.com/Chorus/Message}event')

В вашем примере вы используете CHMasterbook, а иногда и CHMasterBook. Помните, что в XML важен регистр.

person paul trmbrth    schedule 24.11.2013
comment
Спасибо за Ваш ответ. Меня устраивает. CHMasterbook — это опечатка, и это должно быть CHMasterBook. - person wd113; 25.11.2013