在Python中解析XML查找子对象

2024-09-27 09:30:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个Python脚本,它将遍历行并将它们放入我的数据库中

这是我的xml的结构:

Root>
    -<SvcNf>
        -<PersonNf>
            -<PersonList>
                -<Row>
                    <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <Emp_name>James Bond</Emp_name>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Perg>0</Persg>
                     <Perk>15</Persk>
                     <Awart/>
                 </Row>
                 -<Row>
                     .....
                 </Row>
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>

因此,当我使用以下代码解析XML时:

    import xml.etree.ElementTree as ET
    root = ET.parse(events).getroot()
    nodes = root.findall("Row")
    for node in nodes:
            print(node.text)

结果为空

非常感谢!你知道吗

编辑

标称行值为

['MI8','2016-10-28 03:00:12+03:00','9457A55E17341AA7ASDEDS057A8BFF3'等]


Tags: nameuidrootxmlrowempeventidpersonlist
3条回答

您的XML无效:

 <PersID>007</TabNum>
 <Emp_name>James Bond</FIO>

尝试修复XML:

 <PersID>007</PersID>
 <Emp_name>James Bond</Emp_name>

[child.text for child in node]替换node.text。最后,只需使用join函数将列表转换为字符串。你知道吗

https://repl.it/N144/1

root = ET.fromstring("""<Root>
    <SvcNf>
        <PersonNf>
            <PersonList>
                <Row>
                     <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <Emp_name>James Bond</Emp_name>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Persg>0</Persg>
                     <Persk>15</Persk>
                     <Awart/>
                 </Row>
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>""")

nodes = root.findall(".//Row")
for node in nodes:
  print node # print node object
  print(node.text) # print nothing
  print [child.text for child in node] # print child text (as list)

在XML已清理和XML选择器的情况下,您将获得所需的内容:

events = b'''
<Root>
    <SvcNf>
        <PersonNf>
            <PersonList>
                <Row>
                    <SysName>MI8</SysName>
                     <ServerDt>2016-10-28 03:00:12 +03:00</ServerDt>
                     <UID>9457A55E17341AA7ASDEDS057A8BFFF3</UID>
                     <PersID>007</PersID>
                     <FIO>James Bond</FIO>
                     <EventID>25</EventID>
                     <EventTXT>Drinking alcohol</EventTXT>
                     <CauseEventID>03</CauseEventID>
                     <CauseEventTXT>Martini with vodka</CauseEventTXT>
                     <EventBegda>2017-10-18</EventBegda>
                     <EventEndda>2017-10-18</EventEndda>
                     <AccrualsSum>171.0</AccrualsSum>
                     <AccrualsProz>0.0</AccrualsProz>
                     <AccrualsName>Chinees_</AccrualsName>
                     <OrderNum>P-336</OrderNum>
                     <Perg>0</Perg>
                     <Perk>15</Perk>
                     <Awart/>
                </Row>                 
                <Row/>
            </PersonList>
        </PersonNf>
    </SvcNf>
</Root>
'''

import xml.etree.ElementTree as ET
root = ET.fromstring(events)
nodes = root.findall(".//Row")
#[<Element 'Row' at 0x00C217E0>, <Element 'Row' at 0x00C216C0>]

相关问题 更多 >

    热门问题