当前位置: 首页 > 后端技术 > Python

懂女朋友的心不如懂Python:用Python解析和修改XML

时间:2023-03-26 19:28:35 Python

摘要:我们在工作中经常需要解析不同语言编写的数据。Python提供了许多库来解析或拆分用其他语言编写的数据。在这篇PythonXML解析器教程文章中,您可以学习如何使用Python解析XML。以下是本教程涵盖的所有主题:什么是XML?PythonXML解析模块XML代表可扩展标记语言。它在外观上类似于HTML,但XML用于数据表示,而HTML用于定义所使用的数据。XML专门设计用于在客户端和服务器之间来回发送和接收数据。看看下面的:例子:indly$2.5两个两两上面的示例显示了我命名为“Sample.xml”的文件的内容,我将在本PythonXML解析器教程中的所有后续示例中使用相同的内容。PythonXML解析模块Python允许使用两个模块解析这些XML文档,xml.etree.ElementTree模块和Minidom(最小的DOM实现)。解析意味着从文件中读取信息并通过识别特定XML文件的各个部分将其拆分成多个部分。让我们仔细看看如何使用这些模块来解析XML数据。xml.etree.ElementTree模块:该模块帮助我们将XML数据格式化为树结构,这是分层数据的最自然表示。元素类型允许在内存中存储分层数据结构,并具有以下属性:ElementTree是一个包装元素结构并允许与XML相互转换的类。现在让我们尝试使用python模块解析上述XML文件。使用“ElementTree”模块解析文件有两种方法。第一个是使用parse()函数,第二个是fromstring()函数。parse()函数解析作为文件提供的XML文档,而fromstring解析作为字符串提供的XML,即在三重引号内。使用parse()函数:如前所述,此函数获取文件格式的XML并对其进行解析。请参见下面的示例:示例:importxml.etree.ElementTreeasETmytree=ET.parse('sample.xml')myroot=mytree.getroot()如您所见,您需要做的第一件事是导入xml。etree.ElementTree模块。然后,parse()方法解析“Sample.xml”文件。getroot()方法返回“Sample.xml”的根元素。当你执行上面的代码时,你会看到没有任何输出返回,但也没有错误表明代码执行成功。要检查根元素,您可以简单地使用如下打印语句:示例:importxml.etree.ElementTreeasETmytree=ET.parse('sample.xml')myroot=mytree.getroot()print(myroot)输出:上面的输出显示我们的XML文档中的根元素是“元数据”。使用fromstring()函数:您还可以使用fromstring()函数来解析字符串数据。如果您想这样做,请将XML作为字符串传递给三引号,如下所示:importxml.etree.ElementTreeasETdata='''Idly$2.5Twoidly'swithchutney553'''myroot=ET.fromstring(data)#print(myroot)print(myroot.tag)上面的代码将返回与前一个相同的输出。请注意,用作字符串的XML文档只是“Sample.xml”的一部分,我将其用于可见性。您还可以使用完整的XML文档。您还可以使用“标签”对象检索根标签,如下所示:示例:print(myroot.tag)输出:元数据您还可以通过指定要在输出中看到字符串的哪些部分来操作标签字符串输出片。示例:print(myroot.tag\[0:4\])输出:meta如前所述,标签也可以具有字典属性。要检查根标签是否有任何属性,可以使用“attrib”对象,如下所示:示例:print(myroot.attrib)输出:{}如您所见,输出是一个空字典,因为我们的根标签没有属性。寻找感兴趣的元素:根也由子标签组成。要检索根标签的子标签,可以使用以下命令:示例:print(myroot\[0\].tag)输出:food现在,如果要检索根标签的所有第一个子标签,您可以使用for循环对其进行迭代,如下所示:示例:forxinmyroot\[0\]:print(x.tag,x.attrib)output:item{'name':'breakfast'}price{}description{}calories{}returned所有项目都是食物的子属性和标签。要使用ElementTree将文本与XML分开,您可以使用文本属性。例如,如果我想检索有关第一个食物的所有信息,我应该使用以下代码:示例:forxinmyroot\[0\]:print(x.text)输出:lazy$2.5twoelisiblywithTheChutney的553可以看到第一项的文本信息已经作为输出返回了。现在,如果您想显示具有特定价格的所有商品,您可以使用get()方法。此方法访问元素的属性。示例:forxinmyroot.findall('food'):item=x.find('item').textprice=x.find('price').textprint(item,price)输出:Idly$2.5PaperDosa$2.7Upma$3.65BisiBeleBath$4.50KesariBath$1.95上面的输出显示了所有必需的项目和每个项目的价格。使用ElementTree,您还可以修改XML文件。修改XML文件:可以操作XML文件中的元素。为此,您可以使用set()函数。让我们首先看看如何向XML添加内容。添加到XML:以下示例显示如何将内容添加到项目描述。示例:对于myroot.iter('description')中的描述:new\_desc=str(description.text)+'wilbeserved'description.text=str(new\_desc)description.set('updated','yes')mytree.write('new.xml')write()函数有助于创建新的xml文件并将更新后的输出写入同一文件。但是,您也可以使用相同的功能来修改原始文件。执行上述代码后,您将能够看到已经创建了一个包含更新结果的新文件。上图显示了对我们食物的修改描述。要添加新的子标签,您可以使用SubElement()方法。例如,如果您想为第一个项目添加一个新的专业标签,您可以执行以下操作:示例:ET.SubElement(myroot\[0\],'speciality')forxinmyroot.iter('speciality'):new\_desc='SouthIndianSpecial'x.text=str(new\_desc)mytree.write('output5.xml')输出:可以看到,第一个食物标签下新增了一个Label.您可以通过在[]括号内指定下标来在任何地方添加标签。现在让我们看看如何使用此模块删除项目。从XML中删除:要使用ElementTree删除属性或子元素,可以使用pop()方法。此方法将删除用户不需要的必需属性或元素。示例:myroot\[0\]\[0\].attrib.pop('name',None)#创建一个新的XML文件,其中包含结果mytree.write('output5.xml')输出:上图显示名称属性已从项目标签中删除。要删除一个完整的标签,您可以使用相同的pop()方法,如下所示:示例:myroot\[0\].remove(myroot\[0\]\[0\])mytree.write('output6.xml')输出:输出显示食品标签的第一个子元素已被删除。如果要删除所有标签,可以使用clear()函数,如下所示:例子:myroot\[0\].clear()mytree.write('output7.xml')输出:当上面的代码是执行后,第一个A子标签将被完全删除,包括所有子标签。到目前为止,我们一直在使用这个PythonXML解析器教程中的xml.etree.ElementTree模块。现在让我们看看如何使用Minidom解析XML。xml.dom.minidom模块:该模块主要供精通DOM(文档对象模块)的人使用。DOM应用程序通常从将XML解析为DOM开始。在xml.dom.minidom中,这可以通过以下方式实现:使用parse()函数:第一种方式是通过提供要解析的XML文件作为参数来使用parse()函数。示例:fromxml.domimportminidomp1=minidom.parse("sample.xml");完成此操作后,您将能够拆分XML文件并获得所需的数据。您还可以使用此功能来解析打开的文件。示例:dat=open('sample.xml')p2=minidom.parse(dat)在这种情况下,存储打开文件的变量作为参数提供给解析函数。使用parseString()方法:当您想要提供要作为字符串解析的XML时,使用此方法。示例:p3=minidom.parseString('UsingparseString')您可以使用上述任何方法来解析XML。现在让我们尝试使用此模块获取数据。寻找感兴趣的元素:在我的文件被解析后,如果我尝试打印它,返回的输出显示一条消息,表明存储解析数据的变量是一个DOM对象。示例:dat=minidom.parse('sample.xml')print(dat)输出:使用GetElementByTagName访问元素:示例:tagname=dat.getElementsByTagName('item')\[0\]print(tagname)如果我尝试使用GetElementByTagName方法获取第一个元素,我看到以下输出:输出:请注意,只返回一个输出,因为我为了方便使用了[0]下标,这将在以后的示例中被删除。要访问属性的值,我必须按如下方式使用值属性:示例:dat=minidom.parse('sample.xml')tagname=dat.getElementsByTagName('item')print(tagname\[0\].attributes\['name'\].value)输出:Breakfast要检索这些标签中存在的数据,您可以使用数据属性,如下所示:示例:print(tagname\[1\].firstChild.data)输出:PaperDosa您还可以使用value属性拆分和检索属性的值。示例:print(items\[1\].attributes\['name'\].value)输出:Breakfast要打印出我们菜单中所有可用的项目,您可以遍历这些项目并返回所有项目。示例:forxinitems:print(x.firstChild.data)输出:StandbyPaperDOSAUPMABisbelleBathKesariBath要计算菜单上的项目数,可以使用len()函数,如下所示:示例:print(len(items))输出指定我们的菜单包含5个项目。我们的PythonXML解析器教程到此结束。最后,如果文章对你有帮助,记得给作者点个赞哦。以后会继续跟进有关Python的新文章,注意不要迷路。