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

面试官问我:如何在Python中解析修改XML

时间:2023-03-26 14:00:18 Python

总结:我们经常需要解析不同语言编写的数据。Python提供了许多库来解析或拆分用其他语言编写的数据。在此PythonXML解析器教程中,您将学习如何使用Python解析XML。本文分享自华为云社区《从零开始学python | 如何在 Python 中解析和修改 XML?》,原作者:雨川。我们经常需要解析用不同语言编写的数据。Python提供了许多库来解析或拆分用其他语言编写的数据。在此PythonXML解析器教程中,您将学习如何使用Python解析XML。以下是本教程涵盖的所有主题:什么是XML?PythonXML解析模块xml.etree.ElementTree模块使用parse()函数使用fromstring()函数查找感兴趣的元素修改XML文件添加到XML从XMLxml.dom.minidom模块中删除使用parse()函数使用fromString()functionFindingElementsofInterest让我们开始吧。:)什么是XML?XML代表可扩展标记语言。它在外观上类似于HTML,但XML用于数据表示,而HTML用于定义所使用的数据。XML专门设计用于在客户端和服务器之间来回发送和接收数据。看下面的例子:例子:Idly$2.5两个idly'swithchutney553PaperDosa$2.7<700Upma$3.65Ravaupmawithbajji600BisiBeleBath$4.50BisiBeleBathwithsev400KesariBath1.95SaffronSweetRava950上面的示例显示了我命名为“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”的根元素。当你执行上面的代码时,你会看到没有任何输出返回,但也没有错误表明代码执行成功。要检查根元素,您可以简单地使用print语句,如下所示::上面的输出表明我们的XML文档中的根元素是'metadata'。使用fromstring()函数:您还可以使用fromstring()函数来解析字符串数据。如果您想这样做,请将XML作为字符串传递给三重引号,如下所示:importxml.etree.ElementTreeasETdata='''Idly2.5两份酸辣酱553'''myroot=ET.fromstring(data)#print(myroot)print(myroot.tag)上面的代码将返回与前一个相同的输出。请注意,用作字符串的XML文档只是“Sample.xml”的一部分,我将其用于可见性。您还可以使用完整的XML文档。您还可以使用“标签”对象检索根标签,如下所示:示例:print(myroot.tag)输出:元数据您还可以通过指定要在输出中看到字符串的哪些部分来操作标签字符串输出片。示例:print(myroot.tag[0:4])outputs:meta如前所述,标签也可以具有字典属性。要检查根标签是否有任何属性,可以使用“attrib”对象,如下所示:示例:print(myroot.attrib)输出:{}如您所见,输出是一个空字典,因为我们的根标签没有属性。寻找感兴趣的元素:根也由子标签组成。要检索根标签的子标签,可以使用以下命令:示例:print(myroot[0].tag)输出:food现在,如果要检索根的所有第一个子标签,可以迭代它使用for循环如下所示:示例:forxinmyroot[0]:print(x.tag,x.attrib)output:item{'name':'breakfast'}price{}description{}calorie{}all返回的项目是食品子属性和标签。要使用ElementTree将文本与XML分开,您可以使用文本属性。例如,如果我想检索有关第一个食物的所有信息,我应该使用以下代码:示例:forxinmyroot[0]:print(x.text)输出:lazy$2.5twoelisivelywithchutney它可以是从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')输出:如您所见,第一个食物标签下添加了一个新标签。您可以通过在[]括号内指定下标来在任何地方添加标签。现在让我们看看如何使用此模块删除项目。从XML中删除:要使用ElementTree删除属性或子元素,可以使用pop()方法。此方法将删除用户不需要的必需属性或元素。示例:myroot[0][0].attrib.pop('name',None)#创建一个新的XML文件,其中包含结果mytree.write('output5.xml')输出:上图显示name属性具有已从项目标签delete中移除。要删除一个完整的标签,您可以使用相同的pop()方法,如下所示:示例:myroot[0].remove(myroot[0][0])mytree.write('output6.xml')输出:输出第一个显示食品标签的子元素已被删除。如果要删除所有标签,可以使用clear()函数,如下所示:示例:myroot[0].clear()mytree.write('output7.xml')输出:执行上述代码时,食品标签的第一个子标签将被完全删除,包括所有子标签。到目前为止,我们一直在使用这个PythonXML解析器教程中的xml.etree.ElementTree模块。现在让我们看看如何使用Minidom解析XML。xml.dom.minidom模块:这个模块基本上是给精通DOM(DocumentObjectModule)的人使用的。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方法获取第一个元素,我会看到以下输出:Output:请注意,只返回一个输出,因为为了方便起见,我使用[0]下标,将在进一步的示例中删除。要访问属性的值,我必须按如下方式使用值属性:示例:dat=minidom.parse('sample.xml')tagname=dat.getElementsByTagName('item')print(tagname[0].attributes['name'].value)输出:Breakfast要检索这些标签中存在的数据,您可以使用数据属性,如下所示:示例:print(tagname[1].firstChild.data)输出:PaperDosa您也可以使用值属性Split并检索属性的值。示例:print(items[1].attributes['name'].value)输出:Breakfast要打印出我们菜单中所有可用的项目,您可以遍历这些项目并返回所有项目。示例:forxinitems:print(x.firstChild.data)输出:StandbyPaperDOSAUPMABisBelleBathKesariBath要计算菜单上的项目数,可以使用len()函数,如下所示:示例:print(len(items))输出指定我们的菜单包含5个项目。这让我们结束了这个PythonXML解析器教程。我希望你已经清楚地理解了一切。点击关注,第一时间了解华为云的新鲜技术~