繁体   English   中英

Python 3 xml 解析打印问题

[英]Python 3 xml parsing and printing problem

我有一个样本 xml 文件如下

<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--Created with JFLAP 7.1.--><structure>&#13;
    <type>fa</type>&#13;
    <automaton>&#13;
        <!--The list of states.-->&#13;
        <state id="0" name="q1">&#13;
            <x>104.0</x>&#13;
            <y>149.0</y>&#13;
            <initial/>&#13;
        </state>&#13;
        <state id="1" name="q2">&#13;
            <x>210.0</x>&#13;
            <y>153.0</y>&#13;
            <final/>&#13;
        </state>&#13;
        <state id="2" name="q3">&#13;
            <x>292.0</x>&#13;
            <y>155.0</y>&#13;
        </state>&#13;
        <!--The list of transitions.-->&#13;
        <transition>&#13;
            <from>0</from>&#13;
            <to>0</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>1</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>0</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>2</from>&#13;
            <to>1</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>1</from>&#13;
            <to>2</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>2</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
    </automaton>&#13;
</structure>

我正在尝试打印state标签的所有name属性,除了id到目前为止,这是我的代码:

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
for automaton in root.findall('automaton'):
    state = automaton.find('state')
    state_name = state.get('name')
    print(state_name)

我当前的 output:

q1

我的预期 output:

q1
q2
q3

我很困惑,因为我代码中的for循环不会打印所有name属性吗? 我哪里做错了,我该如何解决? 谢谢~

您的代码中缺少另一个findall 有多个state标签。

请参阅下面的代码。 (我用文本 io 缓冲区替换了一个文件。)

    xml = """<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--Created with JFLAP 7.1.--><structure>&#13;
    <type>fa</type>&#13;
    <automaton>&#13;
        <!--The list of states.-->&#13;
        <state id="0" name="q1">&#13;
            <x>104.0</x>&#13;
            <y>149.0</y>&#13;
            <initial/>&#13;
        </state>&#13;
        <state id="1" name="q2">&#13;
            <x>210.0</x>&#13;
            <y>153.0</y>&#13;
            <final/>&#13;
        </state>&#13;
        <state id="2" name="q3">&#13;
            <x>292.0</x>&#13;
            <y>155.0</y>&#13;
        </state>&#13;
        <!--The list of transitions.-->&#13;
        <transition>&#13;
            <from>0</from>&#13;
            <to>0</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>1</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>0</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>2</from>&#13;
            <to>1</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>1</from>&#13;
            <to>2</to>&#13;
            <read>0</read>&#13;
        </transition>&#13;
        <transition>&#13;
            <from>2</from>&#13;
            <to>1</to>&#13;
            <read>1</read>&#13;
        </transition>&#13;
    </automaton>&#13;
</structure>"""


from io import StringIO
import xml.etree.ElementTree as ET

xml_file = StringIO(xml)
tree = ET.parse(xml_file)
root = tree.getroot()
for automaton in root.findall('automaton'):
    for state in automaton.findall('state'): # find all the 'state' tags
        state_name = state.get('name')
        print(state_name)

OUTPUT:

q1
q2
q3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM