تحرير القيم في ملف XML مع Python
-
27-09-2019 - |
سؤال
يا. أرغب في الحصول على ملف config.xml للإعدادات في تطبيق ويب Python.
لقد صنعت car.xml يدويًا. تبدو هكذا:
<car>
<lights>
<blinkers>off</blinkers>
</lights>
</car>
الآن أريد أن أرى ما إذا كان المومضون قيد التشغيل أو يستخدمون ، باستخدام xml.etree.elementtree.
import xml.etree.ElementTree as ET
tree = ET.parse('car.xml')
blinkers = tree.findtext('lights/blinkers')
print blinkers
> off
الآن أريد تشغيل وميض التشغيل وإيقاف تشغيله ، كيف يمكنني القيام بذلك؟
المحلول
XML هي وسيلة سيئة لتخزين إعدادات التكوين. لأحد ، XML ليس صديقًا للبشر تمامًا في سياق الإعدادات. في عالم Python على وجه الخصوص ، من الأفضل استخدام وحدة الإعدادات (كما علقت AaronMcSmooth). لسوء الحظ ، استخدمت الكثير من المشاريع في عالم Java (MIS؟) XML لإعدادات مما يجعلها اتجاهًا. أود أن أزعم أن هذا الاتجاه تمتص حقًا. استخدم الإعدادات الأصلية (الوحدة النمطية في Python) أو شيء أكثر ودية إنسانية مثل Yaml.
نصائح أخرى
يمكنك إزالة العقد عن طريق الاتصال بالعقدة الأصل remove
الطريقة ، وإدراج العقد عن طريق الاتصال et.subelement:
import xml.etree.ElementTree as ET
def flip_lights(tree):
lights = tree.find('lights')
state=get_blinker(tree)
blinkers = tree.find('lights/blinkers')
lights.remove(blinkers)
new_blinkers = ET.SubElement(lights, "blinkers")
new_blinkers.text='on' if state=='off' else 'off'
def get_blinker(tree):
blinkers = tree.find('lights/blinkers')
return blinkers.text
tree = ET.parse('car.xml')
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
flip_lights(tree)
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
tree.write('car2.xml')
دون معالجة مزايا استخدام XML بدلاً من وحدة Python لإدارة ملفات التكوين ، إليك كيفية القيام بما طلبت استخدامه lxml
:
>>> from lxml import etree
>>> xml = """<car>
<lights>
<blinkers>on</blinkers>
</lights>
</car>"""
>>> doc = etree.fromstring(xml)
>>> elm = doc.xpath("/car/lights/blinkers")[0]
>>> elm.text="off"
>>> etree.tostring(doc)
'<car>\n <lights>\n <blinkers>off</blinkers>\n </lights>\n</car>'
ألق نظرة على هذه المقالة.
لكن النظر في تعليق AaronMcSmooth أعلاه - قد يكون هذا هو النهج الخاطئ لمشكلتك العامة.
استخدم beautifulStonSoup. هنا هو القسم المتعلق بتعديل XML:
http://www.crummy.com/software/beautifulsoup/documentation.html#modify٪20the٪20Parse٪20Tree