2016-04-15 3 views
1

У меня есть XML-файл со структурой, аналогичной этойPython: Найти уникальный XML Атрибуты

<records> 
    <record something="this" name="ABC"/> 
    <record something="this" name="DEF"/> 
    <record name="ABC" something="this"/> 
    <record name="GHI" something="this"/> 
    <record something="this" name="ABC/> 

То, что я ищу это Python скрипт, чтобы вернуть все уникальные значения атрибута с именем атрибута name т.е.

ABC 
DEF 
GHI 

Сценарий отлично работает, когда я помещаю имя файла в себя, но когда он передается как параметр, он падает.

from xml.dom import minidom 
import sys 
print sys.argv[1] 
xmldoc = minidom.parse('/root/%s.xml' % sys.argv[1]) 
itemlist = list(xmldoc.getElementsByTagName('record')) 
itemlist.sort() 
for s in itemlist : 
    if s.hasAttribute("name"): 
     print s.attributes['name'].value 

Однако до сих пор не вернуть уникальные значения

+0

Вы должны использовать minidom? –

+0

Нет. Пока это работает. – pee2pee

+0

Итак, в основном вы хотите набор имен? –

ответ

1

Простой способ заключается в использовании набора, а затем сортировки:

Использование LXML:

x = """<records> 
<record something="this" name="ABC"/> 
<record something="this" name="DEF"/> 
<record name="ABC" something="this"/> 
<record name="ABC" something="this"/> 
<record name="GHI" something="this"/> 
<record noname="ijk" something="this"/> 
<record noname="lmn" something="this"/> 
<record noname="xyz" something="this"/> 
</records>""" 

from lxml.etree import fromstring 
tree = fromstring(x) 

print(sorted({n.get("name") for n in tree.findall(".//record[@name]")})) 

Использование XML:

from xml.etree import ElementTree as et 

tree = et.fromstring(x) 

print(sorted({n.get("name") for n in tree.findall(".//record[@name]")})) 

И дам вам:

['ABC', 'DEF', 'GHI'] 

Использование синтаксического анализа с собственным кодом:

from xml.etree import ElementTree as et 
import sys 
print sys.argv[1] 
xmldoc = et.parse('/root/%s.xml' % sys.argv[1]) 

print(sorted({n.get("name") for n in xmldoc.findall(".//record[@name]")})) 
+0

ImportError: не могу импортировать имя parse – pee2pee

+0

извините, что я смешал код lxml и xml, отредактировал –

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