python-使用xml.dom.minidom更新元素值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-使用xml.dom.minidom更新元素值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3116字,纯文字阅读大概需要5分钟。
内容图文
![python-使用xml.dom.minidom更新元素值](/upload/InfoBanner/zyjiaocheng/688/b5b5eb1de64a4417b4e128711d053a39.jpg)
我有一个类似于以下内容的XML结构:
<Store>
<foo>
<book>
<isbn>123456</isbn>
</book>
<title>XYZ</title>
<checkout>no</checkout>
</foo>
<bar>
<book>
<isbn>7890</isbn>
</book>
<title>XYZ2</title>
<checkout>yes</checkout>
</bar>
</Store>
我只想使用xml.dom.minidom(限制)
1)遍历XML文件
2)搜索/获取特定元素,具体取决于其父元素
示例:author1的checkout元素,author2的isbn
3)更改/设置该元素的值
4)将新的XML结构写入文件
有人可以帮忙吗?
谢谢!
更新:
这是我到目前为止所做的
import xml.dom.minidom
checkout = "yes"
def getLoneChild(node, tagname):
assert ((node is not None) and (tagname is not None))
elem = node.getElementsByTagName(tagname)
if ((elem is None) or (len(elem) != 1)):
return None
return elem
def getLoneLeaf(node, tagname):
assert ((node is not None) and (tagname is not None))
elem = node.getElementsByTagName(tagname)
if ((elem is None) or (len(elem) != 1)):
return None
leaf = elem[0].firstChild
if (leaf is None):
return None
return leaf.data
def setcheckout(node, tagname):
assert ((node is not None) and (tagname is not None))
child = getLoneChild(node, 'foo')
Check = getLoneLeaf(child[0],'checkout')
Check = tagname
return Check
doc = xml.dom.minidom.parse('test.xml')
root = doc.getElementsByTagName('Store')[0]
output = setcheckout(root, checkout)
tmp_config = '/tmp/tmp_config.xml'
fw = open(tmp_config, 'w')
fw.write(doc.toxml())
fw.close()
解决方法:
我不确定您所说的“结帐”是什么意思.该脚本将找到该元素并更改该元素的值.也许您可以使其适应您的特定需求.
import xml.dom.minidom as DOM
# find the author as a child of the "Store"
def getAuthor(parent, author):
# by looking at the children
for child in [child for child in parent.childNodes
if child.nodeType != DOM.Element.TEXT_NODE]:
if child.tagName == author:
return child
return None
def alterElement(parent, attribute, newValue):
found = False;
# look through the child elements, skipping Text_Nodes
#(in your example these hold the "values"
for child in [child for child in parent.childNodes
if child.nodeType != DOM.Element.TEXT_NODE]:
# if the child element tagName matches target element name
if child.tagName == attribute:
# alter the data, i.e. the Text_Node value,
# which is the firstChild of the "isbn" element
child.firstChild.data = newValue
return True
else:
# otherwise look at all the children of this node.
found = alterElement(child, attribute, newValue)
if found:
break
# return found status
return found
doc = DOM.parse("test.xml")
# This assumes that there is only one "Store" in the file
root = doc.getElementsByTagName("Store")[0]
# find the author
# this assumes that there are no duplicate author names in the file
author = getAuthor(root, "foo")
if not author:
print "Author not found!"
else:
# alter an element
if not alterElement(author, "isbn", "987654321"):
print "isbn not found"
else:
# output the xml
tmp_config = '/tmp/tmp_config.xml'
f = open(tmp_config, 'w')
doc.writexml( f )
f.close()
通常的想法是,将作者的名称与“ Store”元素的子代的tagNames进行匹配,然后递归遍历作者的子代,以查找与目标元素tagName的匹配.此解决方案中有许多假设,但可能会让您入门.尝试不使用递归处理XML之类的层次结构是很痛苦的.
干杯,
菲尔
回想起来,“ alterElement”函数中存在错误.我已经解决了这个问题(请注意“找到的”变量”)
内容总结
以上是互联网集市为您收集整理的python-使用xml.dom.minidom更新元素值全部内容,希望文章能够帮你解决python-使用xml.dom.minidom更新元素值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。