如何使用python修改xml标记中的属性值

如何使用python修改xml标记中的属性值,python,xml,lxml,graphml,Python,Xml,Lxml,Graphml,我有许多graphml文件,以: <?xml version="1.0" encoding="UTF-8"?> <graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing

我有许多graphml文件,以:

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns/graphml"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/graphml">
它工作得很好,但是在我的一些较大的文件上它肯定太慢了,所以我尝试用lxml做同样的事情,但是我不知道如何达到同样的效果。我设法达到了这些属性,但不知道如何更改它们:

doc = etree.parse(myfile)
root = doc.getroot()
root.attrib
> {'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': 'http://graphml.graphdrawing.org/xmlns/graphml'}

完成这项任务的正确方法是什么?

当你说你有许多文件“从”这4行开始时,如果你真的是说它们完全是这样的话,最快的方法可能是完全忽略这一事实,即它是XML,而只是替换这些行

在Python中,只需阅读前四行,将它们与您期望的内容进行比较(这样,如果它们不匹配,您可以发出警告),然后丢弃它们。写出你想要的新的四行,然后复制文件的其余部分。对每个文件重复此操作

另一方面,如果文件中的任何其他地方都有名称空间属性,则此方法将无法捕获它们,您可能应该执行真正的基于XML的解决方案。使用常规SAX解析器,您可以在每个元素开始、元素结束、文本节点等出现时获得回调。因此,您只需将它们复制出来,直到找到所需的(在本例中为graphml元素),然后写出所需的新标记,而不是复制开始标记。然后回到复制。XSLT也是一种很好的方法,它可以让您编写一个小型通用复印机,再加上一条处理graphml元素的规则

soup = BeautifulSoup(myfile, 'html.parser')
soup.graphml['xmlns'] = 'http://graphml.graphdrawing.org/xmlns'
soup.graphml['xsi:schemalocation'] = "http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"
doc = etree.parse(myfile)
root = doc.getroot()
root.attrib
> {'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': 'http://graphml.graphdrawing.org/xmlns/graphml'}