وحدة للعمل مع ملفات XML

ماذا نفعل



سنقوم اليوم بإنشاء وحدة للعمل مع ملفات 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



شكرا لكم جميعا ونتمنى لك التوفيق.



All Articles