Синтаксический анализ атрибутов XML с помощью Python

#python #xml

#python #xml

Вопрос:

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

XML-документ

Мне нужен текст в атрибутах: name="text1"

От

 project logLevel="verbose" version="2.0" mainModule="Main" name="text1">
  

destinationDir="/text2" От

 put label="Put Files" destinationDir="/Trigger/FPDMMT_INBOUND">
  

destDir="/text3" От

 copy disabled="false" version="1.0" label="Archive Files" destDir="/text3" suffix="">
  

Я использую

 import csv
import os
import re
import xml.etree.ElementTree as ET

tree = ET.parse(XMLfile_path)
item = tree.getroot()[0]
root = tree.getroot()
print (item.get("name"))
print (root.get("name"))
  

Это выводит:

 Main
text1
  

item.get извлекает строку с индексом [0], которая является первым корнем строки в дереве, который
Root.get извлекается из первой строки

Я знаю, что есть способ найти точно правильную часть корня / дерева с помощью чего-то вроде:

 test = root.find('./project/module/ftp/put')
print (test.get("destinationDir"))
  

Мне нужно иметь возможность перейти непосредственно к тому, что мне нужно, и вывести нужные мне атрибуты.

Любая помощь будет оценена

Спасибо.

Комментарии:

1. Вам придется отредактировать свой вопрос с помощью чистой, желательно упрощенной версии xml; трудно помочь только с изображением.

2. Вам больше повезет получить ответ, если вы отредактируете этот XML до чего-то достаточно большого, чтобы продемонстрировать проблему и опубликовать ее вместе с вопросом. Что-то, что мы можем использовать сами. Должно быть легко загрузить его в примерную программу, в которой содержится ваша лучшая попытка и которая также включена в этот вопрос. Упростите нам помощь.

3. Пожалуйста, обновите вопрос ДЕЙСТВИТЕЛЬНЫМ XML-документом — в виде текста, пожалуйста.

Ответ №1:

Упрощенная копия вашего XML:

 xml = '''<project logLevel="verbose" version="2.0" mainModule="Main" name="hidden">
    <module name="Main">
        <createWorkspace version="1.0"/>
        <ftp version="1.0" label="FTP connection to PRD">
            <put label="Put Files" destinationDir="destination1">
            </put>
        </ftp>
        <ftp version="1.0" label="FTP connection to PRD">
            <put label="Put Files" destinationDir="destination2">
            </put>
        </ftp>
        <copy disabled="false" destDir="destination3">
        </copy>
    </module>
</project>
'''

# solution using ETree
from xml.etree import ElementTree as ET

root = ET.fromstring(xml)

name = root.get('name')
ftp_destination_dir1 = root.findall('./module/ftp/put')[0].get('destinationDir')
ftp_destination_dir2 = root.findall('./module/ftp/put')[1].get('destinationDir')
copy_destination_dir = root.find('./module/copy').get('destDir')

print(name)
print(ftp_destination_dir1)
print(ftp_destination_dir2)
print(copy_destination_dir)

# solution using lxml
from lxml import etree as et

root = et.fromstring(xml)

name = root.get('name')
ftp_destination_dirs = root.xpath('./module/ftp/put/@destinationDir')
copy_destination_dir = root.xpath('./module/copy/@destDir')[0]

print(name)
print(ftp_destination_dirs[0])
print(ftp_destination_dirs[1])
print(copy_destination_dir)