#python #xml
#python #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)