📜  如何在Python中解析和修改 XML?

📅  最后修改于: 2022-05-13 01:55:17.931000             🧑  作者: Mango

如何在Python中解析和修改 XML?

XML代表可扩展标记语言。它旨在存储和传输数据。它被设计为人类和机器可读的。这就是为什么 XML 的设计目标强调在 Internet 上的简单性、通用性和可用性。

注意:有关详细信息,请参阅 XML |基本

这里我们认为 XML 文件存在于内存中。请阅读代码中的注释以获得清晰的理解。

XML 文件:

蟒蛇解析XML

让我们将上面的 XML 文件保存为“test.xml” 。在继续之前,您应该知道在 XML 中我们没有像在 HTML 中那样预定义的标签。在编写 XML 时,作者必须定义他/她自己的标签以及文档结构。现在我们需要解析这个文件并使用Python修改它。我们将使用Python 3“minidom”库来完成上述任务。这个模块没有内置在Python中。要安装此类型,请在终端中输入以下命令。

pip install minidom

读取 XML

首先我们将阅读 XML 文件的内容,然后我们将学习如何修改 XML 文件。
例子

import xml.dom.minidom as md
  
def main():
  
    # parsing the xml file and 
    # storing the contents in 
    # "file" object Put in the 
    # path of your XML file in
    # the parameter for parse() method.
    file = md.parse( "test.xml" ) 
  
    # nodeName returns the type of 
    # the file(in our case it returns
    # document)
    print( file.nodeName )
  
    # firstChild.tagName returns the 
    # name of the first tag.Here it 
    # is "note"
    print( file.firstChild.tagName )
  
    firstname = file.getElementsByTagName( "fname" )
  
    # printing the first name
    print( "Name: " + firstname[ 0 ].firstChild.nodeValue ) 
  
    lastname = file.getElementsByTagName( "lname" )
  
    # printing the last name
    print( "Surname: " + lastname[ 0 ].firstChild.nodeValue )
  
    favgame = file.getElementsByTagName( "favgame" )
  
    # printing the favourite game
    print( "Favourite Game: " + favgame[ 0 ].firstChild.nodeValue )
  
    # Printing tag values having 
    # attributes(Here tag "player"
    # has "name" attribute)
    players = file.getElementsByTagName( "player" )
  
    for player in players:
        print( player.getAttribute( "name" ) )
  
if __name__=="__main__":
    main();

输出

#document
note
Name: Jack
Surname: Shelby
Favourite Game: Football
Messi
Ronaldo
Mbappe

在上面的Python代码中,在打印First NameLast Name时,我们使用了firstname[0] / lastname[0] 。这是因为只有 1 个“fname”和只有 1 个“lname”标签。对于多个相同的标签,我们可以像下面这样继续。
XML:

python-parse-xml-2

Python

import xml.dom.minidom as md
  
def main():
  
    file = md.parse( "test.xml" )
    names = file.getElementsByTagName( "fname" )
  
    for name in names:
  
        print( name.firstChild.nodeValue )
  
if __name__=="__main__":
    main();

输出

Jack
John
Harry

修改 XML

现在我们对如何使用Python解析和读取 XML 文件的内容有了基本的了解。现在让我们学习修改XML 文件。
XML 文件:

python-parse-xml-3

让我们添加以下内容:

  • 高度
  • 杰克知道的语言

让我们删除“爱好”标签。还让我们将年龄修改29
Python代码:(修改 XML)

import xml.dom.minidom as md
  
def main():
  
    file = md.parse("test.xml")
    
    height = file.createElement( "height" )
  
    # setting height value to 180cm
    height.setAttribute("val", "180 cm") 
   
    # adding height tag to the "file" 
    # object
    file.firstChild.appendChild(height) 
  
    lan = [ "English", "Spanish", "French" ]
  
    # creating separate "lang" tags for
    # each language and adding it to 
    # "file" object
    for l in lan: 
          
        lang = file.createElement( "lang" )
        lang.setAttribute( "lng", l )
        file.firstChild.appendChild( lang )
  
    delete = file.getElementsByTagName( "hobby" )
  
    # deleting all occurences of a particular 
    # tag(here "hobby")
    for i in delete: 
  
        x = i.parentNode
        x.removeChild( i )
  
    # modifying the value of a tag(here "age")
    file.getElementsByTagName( "age" )[ 0 ].childNodes[ 0 ].nodeValue = "29" 
  
    # writing the changes in "file" object to 
    # the "test.xml" file
    with open( "test.xml", "w" ) as fs: 
  
        fs.write( file.toxml() )
        fs.close() 
  
if __name__=="__main__":
    main();

输出:

python-parse-xml-4

Python代码的最后 3 行只是使用toxml()方法将“file”对象转换为 XML 并将其写入“test.xml”文件。如果您不想编辑原始文件而只想打印修改后的 XML,则将这 3 行替换为:

print(file.toxml())