用于处理XML文件的模块

我们做什么



今天,我们将创建一个用于处理XML文件模块



做什么的



有时,当使用Python开发程序时,您需要进行设置,任何用户都可以在不更改代码的情况下进行更改。



我们需要什么



  • 编程语言Python知识
  • Python3
  • Python xml库


开始吧



首先,让我们导入库并创建主类。



import xml.etree.ElementTree as xml

class XML:
    pass


要使用XML文件,我们需要XML文件本身,但是在程序首次启动时,用户可能没有此文件,因此我们需要创建它。



创建类的实例时,传递文件名并将其存储在fileName参数中。



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()方法中,我们传递要接收的标记(元素)的名称以及要返回的数据类型的布尔值。如果text = True,则将返回元素的值,否则将返回对象,然后可以对其进行迭代。例如,我们有一个XML文件:



<settings>
    <text>Hello, world!</text>
    <list>
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </list>
</settings>


如果要向控制台显示所有项目值,则解析“ list”参数并将第二个参数False传递给parsingFile()。我们开始遍历接收到的元素并显示element.text-具有选定元素的值。



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