ماذا نفعل
سنقوم اليوم بإنشاء وحدة للعمل مع ملفات XML .
لاجل ماذا
في بعض الأحيان ، عند تطوير برنامج في Python ، تحتاج إلى ضبط الإعدادات التي يمكن لأي مستخدم تغييرها دون تغيير الكود.
ماذا نحتاج
- معرفة لغة البرمجة بايثون
- بايثون 3
- مكتبة Python xml
لنبدأ
أولاً ، دعنا نستورد المكتبة وننشئ الفصل الرئيسي.
import xml.etree.ElementTree as xml
class XML:
pass
للعمل مع ملف XML ، نحتاج إلى ملف XML نفسه ، ولكن في أول تشغيل للبرنامج ، قد لا يكون لدى المستخدم هذا الملف ، لذلك نحتاج إلى إنشائه.
عند إنشاء مثيل للفئة ، مرر اسم الملف وقم بتخزينه في معلمة اسم الملف.
import xml.etree.ElementTree as xml
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
سنقوم الآن بكتابة وظيفة تتحقق مما إذا كان ملفنا موجودًا وسوف نسميه في وقت إنشاء مثيل للفئة.
import xml.etree.ElementTree as xml
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
print("File not found")
بعد ذلك ، سنكتب دالة ستنشئ ملفنا إذا لم يكن موجودًا ، وسنسميها إذا لم يعثر البرنامج على الملف.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
الآن دعونا نلقي نظرة فاحصة على وظيفة XML.createFile ():
- rootXML هو العنصر الرئيسي الذي سيسمح لكتابة جميع الإعدادات إلى ملف جديد بشكل أسرع مما لو كتبنا جميع العلامات بشكل منفصل
- text هو العلامة التي سيتم عرضها داخل rootXML. في الحقل Element.text ، حدد ما يجب أن يكون داخل العنصر
لعمل قائمة بالعناصر ، على سبيل المثال:
<settings>
<text>Hello, world!</text>
<list>
<item>1</item>
<item>2</item>
<item>3</item>
</list>
</settings>
قم بإنشاء عنصر رئيسي ، في حالتنا "قائمة" وعناصر فرعية "عنصر".
list = xml.Element("list")
rootXML.append(list)
item: xml.SubElement
item = xml.SubElement(list, "item")
item.text = "1"
item = xml.SubElement(list, "item")
item.text = "2"
item = xml.SubElement(list, "item")
item.text = "3"
#xml.SubElement(parent: xml.Element or xml.SubElement, tag: str)
#
إذا كان برنامجنا عبارة عن برنامج به واجهة ، وتم استخدام ملف الإعدادات لتخزين أي قيم يمكن للمستخدم تغييرها ، فنحن بحاجة إلى وظيفة يمكنها تغيير قيمة العنصر. دعنا نكتبها.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
def editFile(self, element, value):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for elem in rootXML.iter(element):
elem.text = str(value)
tree = xml.ElementTree(rootXML)
tree.write(self.fileName)
في وظيفة editFile () ، نقوم بتمرير اسم العنصر (العنصر) الذي نريد تغييره والقيمة الجديدة (القيمة).
وآخر شيء تحتاجه لأي عمل باستخدام ملفات XML هو تحليل البيانات.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
def editFile(self, element, value):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for elem in rootXML.iter(element):
elem.text = str(value)
tree = xml.ElementTree(rootXML)
tree.write(self.fileName)
def parsingFile(self, elements, text = True):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for element in rootXML.iter(elements):
if (text):
return element.text
return element
في طريقة parsingFile () ، نقوم بتمرير اسم العلامة (العنصر) الذي نريد تلقيه والقيمة المنطقية لنوع البيانات الذي سيتم إرجاعه. إذا كان النص = صحيحًا ، فسيتم إرجاع قيمة العنصر ، وإلا فسيتم إعادة الكائن ، والذي يمكن تكراره بعد ذلك. على سبيل المثال ، لدينا ملف XML:
<settings>
<text>Hello, world!</text>
<list>
<item>1</item>
<item>2</item>
<item>3</item>
</list>
</settings>
وإذا أردنا عرض جميع قيم العناصر على وحدة التحكم ، فإننا نحلل معلمة "list" ونمرر False باعتباره المعامل الثاني في parsingFile (). نبدأ في التكرار على العنصر المستلم وعرض العنصر. نص - مع وجود قيمة العنصر المحدد.
import XML as xml
moduleXml = xml.XML("settings")
for element in moduleXml.parsingFile("list", False):
print(element.text)
بعد تنفيذ هذا الرمز في وحدة التحكم ، سنرى:
1
2
3
خاتمة
نتيجة لذلك ، حصلنا على وحدة يمكن استخدامها في مشاريعك للعمل مع ملفات XML.
مشروع على gitHub
شكرا لكم جميعا ونتمنى لك التوفيق.