Создание документа xml с помощью python/ElementTree и пространств имен

Я пытаюсь создать в памяти XML-документ, чтобы для всех дочерних узлов корня требовалось пространство имен.

Окончательный документ должен выглядеть примерно так:

<Feed>            
<FeedEntity Id="0000" 
      xmlns="http://schemas.example.com/search/query/2010/5/revision">

    <FeedRequest locale="en-US" title="<some value>"/>
</FeedEntity>
... another FeedEntity element ...
</Feed>            

Однако, когда я распечатываю документ, созданный с помощью ElementTree lib, он выглядит примерно так:

<Feed>
    <ns0:FeedEntity Id="0000"
      xmlns:ns0="http://schemas.example.com/search/query/2010/5/revision">

        <FeedRequest locale="en-US" title="<some value>"/>
    </ns0:FeedEntity>
</Feed>

Вот как я создаю документ:

counter = 0
namespace = "http://schemas.example.com/search/query/2010/5/revision"

root = Element("Feed")        

node_name = "{%s}FeedEntity" % (namespace, );                
feed_entity_element = Element(node_name)        

feed_entity_element["Id"] = "%04d" % (counter,);

feed_request_element = Element("FeedRequest");
feed_request_element["Culture"] = self.culture;
feed_request_element["Query"] = address;        

# append each of the elements to the xml document 
feed_entity_element.append(feed_request_element);

root.append(feed_entity_element);

str_data = ET.tostring(root)
print str_data

Как избавиться от частей «ns0» в окончательном XML, чтобы он больше походил на первый пример, упомянутый выше?


person Dan Holman    schedule 05.09.2011    source источник
comment
Почему вы хотите изменить его - все, что использует XML, должно относиться к двум версиям одинаково.   -  person mmmmmm    schedule 06.09.2011


Ответы (1)


С xml.etree вы не можете получить точный вывод, как в первом примере, но вы можете использовать (глобальный) register_namespace() для использования "лучшего" префикса, чем "ns0". Например: ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision') гарантирует, что вывод будет выглядеть как rev:FeedEntity.

Однако (совместимая) библиотека lxml является более гибкой в ​​отношении префиксов пространств имен, а позволяет указать сопоставление префикса при создании элемента.

person Steven    schedule 05.09.2011
comment
Оказывается, вы также можете назначить атрибут «xmlns» для элемента, и он выдаст тот же вывод строки xml. - person Dan Holman; 06.09.2011