2015-07-07 8 views
0

Для программы на Python Я ищу способ найти конкретный текст в элементе XML и узнать, какой номер узла он есть.Поиск определенного текста в элементе XML с DOM (Python)

Это XML:

-<shortcut> 
<label>33060</label> 
<label2>Common Shortcut</label2> 
</shortcut> 

-<shortcut> 
<label>Test</label> 
</shortcut> 

Конечно, я знаю, что это, вероятно, узел номер 2 здесь, но файл XML может быть больше.

Это должны способами я пытался, но я не получаю, чтобы работать должным образом:

xmldoc = minidom.parse("/DATA.xml") 
Shortcut = xmldoc.getElementsByTagName("shortcut") 
Label = xmldoc.getElementsByTagName("label") 
print xmldoc.getElementsByTagName("label")[12].firstChild.nodeValue (works) 
for element in Label: 
    if element.getAttributeNode("label") == 'Test': 
    # if element.getAttributeNode('label') == "Test": 
    print "element found" 
else: 
    print "element not found" 

for node in xmldoc.getElementsByTagName("label"): 
    if node.nodeValue == "Test": 
     print "element found" 
else: 
    print "element not found" 
+0

Каков ваш ожидаемый результат для данного XML? – Sait

+0

Он должен дать тест. Но это часть xml. – Helfenstein

+0

@ Хелфенштайн, это 'lxml' вариант? Использование ** XPath ** представляется наиболее разумным для этого решения, если вам не нужно перебирать дерево узлов и проверять атрибут текста. Однако я не знаком с «минидом». – Anzel

ответ

1

Этот рабочий пример демонстрирует один возможный способ поиска элемента, содержащий конкретный текст, используя minidom модуль *:

from xml.dom.minidom import parseString 

def getText(nodelist): 
    rc = [] 
    for node in nodelist: 
     if node.nodeType == node.TEXT_NODE: 
      rc.append(node.data) 
    return ''.join(rc) 


xml = """<root> 
<shortcut> 
<label>33060</label> 
<label2>Common Shortcut</label2> 
</shortcut> 
<shortcut> 
<label>Test</label> 
</shortcut> 
</root>""" 
xmldoc = parseString(xml) 
labels = xmldoc.getElementsByTagName("label") 
for label in labels: 
    text = getText(label.childNodes) 
    if text == "Test": 
     print("node found : " + label.toprettyxml()) 
     break 

выход:

node found : <label>Test</label> 

*) getText() функция снят из minidom documentation страница.

+0

Это начинает хорошо выглядеть. Как вы можете получить номер узла? Я посмотрю на него сегодня вечером. Что делать, чтобы вернуть часть? Я еще не знаком с python. – Helfenstein

+0

'getText()' функция возвращает конкатенированный текст всех узлов в аргументе 'nodelist'. – har07

+0

Отлично! Работал, как вы сказали. – Helfenstein

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

  • Нет связанных вопросов^_^