Python 用minidom解析XML

Python 用minidom解析XML,python,xml,xml-parsing,minidom,Python,Xml,Xml Parsing,Minidom,我在与渺小作斗争。我需要在dom中找到一个条目,更新它所包含的文本,然后保存文件。到目前为止,我成功定位特定元素的唯一方法是通过一种非常明确、直接、硬编码的方法: doc.childNodes[0].childNodes[3].childNodes[5].childNodes[11].childNodes[1].childNodes[3] 我只想更新中的第一个 123456 福巴 1. 1. 1. 图片/foo.png 福--> ... 建议 如果要在childNodes列表中查找第一项

我在与渺小作斗争。我需要在dom中找到一个条目,更新它所包含的文本,然后保存文件。到目前为止,我成功定位特定元素的唯一方法是通过一种非常明确、直接、硬编码的方法:

doc.childNodes[0].childNodes[3].childNodes[5].childNodes[11].childNodes[1].childNodes[3] 
我只想更新
中的第一个


123456
福巴
1.
1.
1.
图片/foo.png
福-->
...

建议

如果要在
childNodes
列表中查找第一项,请尝试使用:

typeBox_node = next((node for node in typeBoxs_node.childNodes \
                              if node.localName == 'typeBox'))
如果要对某个元素的每个元素执行此操作,请尝试:

for typeBox_node in doc.getElementsByTagName('typeBox'):
    text_node = next((node for node in typeBox_node.childNodes \
                              if node.localName == 'text'))

如果要在
childNodes
列表中查找第一项,请尝试使用:

typeBox_node = next((node for node in typeBoxs_node.childNodes \
                              if node.localName == 'typeBox'))
如果要对某个元素的每个元素执行此操作,请尝试:

for typeBox_node in doc.getElementsByTagName('typeBox'):
    text_node = next((node for node in typeBox_node.childNodes \
                              if node.localName == 'text'))

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

>>> 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>
>>> 
>>从xml.etree导入元素树作为etree
>>>语料库=”“”
...     
...         123456
…福巴
1.
1.
1.
...     
...     
…images/foo.png
…福-->
...     
... """
>>> 
>>>doc=etree.fromstring(语料库)
>>> 
>>>对于doc.findall中的typeBox(“typeBox”):
...     如果typeBox.attrib.get('type')='counter':
...         fieldnum=int(typeBox.find('incrementTextFieldNum').text)
...         incr=int(typeBox.find('increment').text)
...         text\u field=typeBox.findall('text')[fieldnum-1]
...         text\u field.text=str(int(text\u field.text)+incr)
... 
>>>打印etree.tostring(文档)
123457
福巴
1.
1.
1.
图片/foo.png
福--
>>> 

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

>>> 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>
>>> 
>>从xml.etree导入元素树作为etree
>>>语料库=”“”
...     
...         123456
…福巴
1.
1.
1.
...     
...     
…images/foo.png
…福-->
...     
... """
>>> 
>>>doc=etree.fromstring(语料库)
>>> 
>>>对于doc.findall中的typeBox(“typeBox”):
...     如果typeBox.attrib.get('type')='counter':
...         fieldnum=int(typeBox.find('incrementTextFieldNum').text)
...         incr=int(typeBox.find('increment').text)
...         text\u field=typeBox.findall('text')[fieldnum-1]
...         text\u field.text=str(int(text\u field.text)+incr)
... 
>>>打印etree.tostring(文档)
123457
福巴
1.
1.
1.
图片/foo.png
福--
>>> 

您通常能找到什么?你能找到
typeBox
元素吗?你能得到
文本
元素的列表吗?向我们展示您的代码。我使用doc.getElementsByTagName('typeBox')[0]可以更好地访问它。childNodes[1],但即使这仍然是硬编码的标记。您通常能找到什么?你能找到
typeBox
元素吗?你能得到
文本
元素的列表吗?向我们展示您的代码。使用doc.getElementsByTagName('typeBox')[0]我可以更好地访问它。childNodes[1],但即使这仍然是硬编码的标记。有趣的是,doc.findall('typeBox')找不到任何东西。您正在解析的文档的根节点真的是
?如果是其他内容,您可能需要首先遍历到该节点。不,不是,是。啊,是的,>>>e.getroot()>>>e.findall('typeBox')[,,],使用minidom做同样的事情没有问题。有趣的是,doc.findall('typeBox')找不到任何东西您正在解析的文档的根节点真的是
?如果是其他内容,您可能需要首先遍历到该节点。不,不是,是。啊,是的,>>>e.getroot()>>>e.findall('typeBox')[,,],使用minidom做同样的事情没有问题。