2014-11-19 7 views
0

У меня есть XML-документ, который мне нужен для синтаксического анализа, но я застрял, я могу сказать, в самом начале. Вот часть файла xml.Python2 извлечение тегов из xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

Я хочу распечатать только теги элементов. Я делаю это с помощью этой части кода python docs. Я выдаю эти команды в интерпретаторе python.

tree = ET.parse('pom.xml') 
root = tree.getroot() 
root = ET.fromstring(data) 
root.tag 

root.tag возвращает это

{http://maven.apache.org/POM/4.0.0}project 

ли ожидаемый результат просто

project 

?

+0

Что находится в 'data'? –

+0

Я не нашел закрывающего тега. –

ответ

1

Питон синтаксического анализа XML таким образом, что держит декларируемые пространства имен и, таким образом, не теряет данные, поэтому ожидаемый результат не только project :)

{http://maven.apache.org/POM/4.0.0}project вы видите это пространство имен определенное имя для тег.

Даже если начало тега <project не содержит префикса пространства имен, сразу следующий атрибут xmlns="http://maven.apache.org/POM/4.0.0" объявляет каждый тег, у которого нет явного префикса пространства имен, принадлежащего этому пространству имен.

Если вам абсолютно не требуется имя, отличное от пространства имен, вы можете, конечно, сделать tag_name = element.tag.split("}", 1)[-1]. (Это должно быть безопасным для не-пространства имен, имен из-за -1 индексации.)

И, конечно, вы можете рекурсивно ходить дерево ElementTree и заменить все tag.name с с их не-пространства имен, имен с указанным выше выражением если вы действительно этого хотите.

+0

Спасибо, ваш ответ завершен, и ваше понимание моего вопроса является совершенным. Хотя я мог бы спросить об этом лучше. – titus

Смежные вопросы