首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用minidom解析XML

用minidom解析XML
EN

Stack Overflow用户
提问于 2011-07-23 05:15:55
回答 2查看 1.1K关注 0票数 0

我正在和迷你多米做斗争。我需要在dom中找到一个条目,更新它保存的文本,然后保存文件。到目前为止,我唯一能够成功定位特定元素的方法是通过一个非常明确、直接、硬编码的方法:

代码语言:javascript
复制
doc.childNodes[0].childNodes[3].childNodes[5].childNodes[11].childNodes[1].childNodes[3] 

我只想更新<typeBox type="counter">中的第一个<text>

代码语言:javascript
复制
<typeBoxes>
    <typeBox type="counter">
        <text fontSize="140">123456</text>
        <text fontSize="26">Foobar</text>
        <incrementTextFieldNum>1</incrementTextFieldNum>
        <timing>1</timing>
        <increment>1</increment>
    </typeBox>
    <typeBox>
        <image>images/foo.png</image>
        <text fontSize="26">Foo</text>-->
    </typeBox>

    ...

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-23 05:46:13

minidom不是很强大,现在大多数人都在使用ElementTree的一些变体。Python2.5和更高版本内置了它。

代码语言:javascript
复制
>>> from xml.etree import ElementTree as etree
>>> corpus = """<typeBoxes>
...     <typeBox type="counter">
...         <text fontSize="140">123456</text>
...         <text fontSize="26">Foobar</text>
...         <incrementTextFieldNum>1</incrementTextFieldNum>
...         <timing>1</timing>
...         <increment>1</increment>
...     </typeBox>
...     <typeBox>
...         <image>images/foo.png</image>
...         <text fontSize="26">Foo</text>-->
...     </typeBox>
... </typeBoxes>"""
>>> 
>>> doc = etree.fromstring(corpus)
>>> 
>>> for typeBox in doc.findall('typeBox'):
...     if typeBox.attrib.get('type') == 'counter':
...         fieldnum = int(typeBox.find('incrementTextFieldNum').text)
...         incr = int(typeBox.find('increment').text)
...         text_field = typeBox.findall('text')[fieldnum-1]
...         text_field.text = str(int(text_field.text) + incr)
... 
>>> print etree.tostring(doc)
<typeBoxes>
    <typeBox type="counter">
        <text fontSize="140">123457</text>
        <text fontSize="26">Foobar</text>
        <incrementTextFieldNum>1</incrementTextFieldNum>
        <timing>1</timing>
        <increment>1</increment>
    </typeBox>
    <typeBox>
        <image>images/foo.png</image>
        <text fontSize="26">Foo</text>--&gt;
    </typeBox>
</typeBoxes>
>>> 
票数 4
EN

Stack Overflow用户

发布于 2011-07-23 05:45:35

如果要查找childNodes列表中的第一项,请尝试使用以下命令:

代码语言:javascript
复制
typeBox_node = next((node for node in typeBoxs_node.childNodes \
                              if node.localName == 'typeBox'))

如果您想对某个元素中的每个元素执行此操作,请尝试:

代码语言:javascript
复制
for typeBox_node in doc.getElementsByTagName('typeBox'):
    text_node = next((node for node in typeBox_node.childNodes \
                              if node.localName == 'text'))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6796227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档