2016-09-13 5 views
0

У меня есть файл XML POM, как следующее:Получение ребенка атрибутов из документа XML с помощью элемента дерева

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<parent> 
    <groupId>com.amirsys</groupId> 
    <artifactId>components-parent</artifactId> 
    <version>RELEASE</version> 
</parent> 
<artifactId>statdxws</artifactId> 
<version>6.5.0-16</version> 
<packaging>war</packaging> 
<dependencies> 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.4-1200-jdbc41</version> 
     <scope>provided</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-simple</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>com.amirsys</groupId> 
     <artifactId>referencedb</artifactId> 
     <version>5.0.0-1</version> 
     <exclusions> 
      <exclusion> 
       <groupId>com.amirsys</groupId> 
       <artifactId>jig</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 

Я пытаюсь вытащить groupIds, artifactIds и версий с использованием элементов дерева для создания объект зависимости, но он не найдет теги зависимостей. Это мой код до сих пор:

tree = ElementTree.parse('pomFile.xml') 
root = tree.getroot() 
namespace = '{http://maven.apache.org/POM/4.0.0}' 
for dependency in root.iter(namespace+'dependency'): 
    groupId = dependency.get('groupId') 
    artifactId = dependency.get('artifactId') 
    version = dependency.get('version') 
    print groupId, artifactId, version 

Это не выводит ничего, и я не могу понять, почему код не перебора тега зависимостей. Любая помощь будет оценена по достоинству.

ответ

0

Ваш XML имеет небольшую ошибку. Должен быть закрывающий тег </project>, который вы, вероятно, пропустили в вопросе.

следующие работы для меня:

from xml.etree import ElementTree 
tree = ElementTree.parse('pomFile.xml') 
root = tree.getroot() 
namespace = '{http://maven.apache.org/POM/4.0.0}' 
for dependency in root.iter(namespace+'dependency'): 
    groupId = dependency.find(namespace+'groupId').text 
    artifactId = dependency.find(namespace+'artifactId').text 
    version = dependency.find(namespace+'version').text 
    print groupId, artifactId, version 

$ python -i a.py 
org.postgresql postgresql 9.4-1200-jdbc41 
com.amirsys referencedb 5.0.0-1 

Ваше использование .get() неправильно. Посмотрите, как работает .get(). Допустим, что ваш XML является:

<?xml version="1.0"?> 
<data> 
    <country name="Liechtenstein"> 
     <rank>1</rank> 
     <year>2008</year> 
     <gdppc>141100</gdppc> 
     <neighbor name="Austria" direction="E"/> 
     <neighbor name="Switzerland" direction="W"/> 
    </country> 
    <country name="Singapore"> 
     <rank>4</rank> 
     <year>2011</year> 
     <gdppc>59900</gdppc> 
     <neighbor name="Malaysia" direction="N"/> 
    </country> 
    <country name="Panama"> 
     <rank>68</rank> 
     <year>2011</year> 
     <gdppc>13600</gdppc> 
     <neighbor name="Costa Rica" direction="W"/> 
     <neighbor name="Colombia" direction="E"/> 
    </country> 
</data> 

И вы пишете питон код, как:

import xml.etree.ElementTree as ET 
tree = ET.parse('country_data.xml') 
root = tree.getroot() 
for country in root.findall('country'): 
    rank = country.find('rank').text 
    name = country.get('name') 
    print rank, name 

Это будет печатать:

Liechtenstein 1 
Singapore 4 
Panama 68 

Как вы можете видеть, .get() дает вам значение атрибута. docs довольно понятны.

+0

@ d.griner Вы должны прочитать следующее: https://docs.python.org/2/library/xml.etree.elementtree.html#parsing-xml-with-namespaces –

+0

Спасибо, это точно отвечает на мой вопрос , Я ценю это! –