Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-使用minidom读取XML_Python_Xml_Python 3.x_Minidom - Fatal编程技术网

Python-使用minidom读取XML

Python-使用minidom读取XML,python,xml,python-3.x,minidom,Python,Xml,Python 3.x,Minidom,我是Python新手,我有一个问题。 我正在尝试解析此xml(此xml包含多个信息,这是我需要读取的第一个数据): cr:908715 参考编号 497131 支持_lev.sym 开放日 1516290907 自动识别码 优先 3. 租户id F3CA8B5A2A456742B21EF8F3B5538623 租户名称 里普利 日志代理 088966043F4D2944AA90067C52DA454F 请求者姓名 请求者姓名 客户名 胡安·吉列尔莫 客户姓氏 门多萨·蒙特罗 客户id 8C02

我是Python新手,我有一个问题。 我正在尝试解析此xml(此xml包含多个信息,这是我需要读取的第一个数据):


cr:908715
参考编号
497131
支持_lev.sym
开放日
1516290907
自动识别码
优先
3.
租户id
F3CA8B5A2A456742B21EF8F3B5538623
租户名称
里普利
日志代理
088966043F4D2944AA90067C52DA454F
请求者姓名
请求者姓名
客户名
胡安·吉列尔莫
客户姓氏
门多萨·蒙特罗
客户id
8C020EBAD32035419D7654CDE510D312
类别id
1121021012
类别.sym
里普利。金融系统。终端金融。门萨杰德
错误
status.sym
暂停的
组id
099621F7BD77C545B65FB65BFE466550
组名
第五区
zreporting_met.id
7300
zreporting_met.sym
电子邮件
Assignment.combo_名称
开放日
1516290907
截止日期
描述
Asunto:Valaparaiseo/终端财务错误
名字:胡安·门多萨·蒙特罗
乌比卡翁:瓦尔帕莱索维多利亚瓦尔帕莱索广场CCSS 1646
帕伊斯:智利
电话号码:ANEXO 2541
科雷奥:jmendozam@ripley.cl
Descripción:终端财务错误
笛卡尔:不适用
总结
圣地亚哥/莫迪菲卡松
但当我用这种方法读取文件时:

from zeep import Client
import xml.dom.minidom
from xml.dom.minidom import Node

def select():
resultado = []
sid = _client.service.login("User","password")
objectType = 'cr'
whereClause = "group.last_name LIKE 'EUS_ZONA%' AND open_date > 1517454000 
AND open_date < 
1519786800"
maxRows = -1
attributes = ["ref_num"
      ,"agt.id"
      ,"priority"
      ,"pcat.id"
      ,"tenant.id"
      ,"tenant.name"
      ,"log_agent"
      ,"request_by.first_name"
      ,"request_by.last_name"
      ,"customer.first_name"
      ,"customer.last_name"
      ,"customer.id"
      ,"category.id"
      ,"category.sym"
      ,"status.sym"
      ,"group.id"
      ,"group.last_name"
      ,"zreporting_met.id"
      ,"zreporting_met.sym"
      ,"assignee.combo_name"
      ,"open_date"
      ,"close_date"
      ,"description"
      ,"summary"]
minim = _client.service.doSelect(sid=sid, objectType=objectType, 
whereClause=whereClause, maxRows= maxRows, attributes= attributes)
dom = xml.dom.minidom.parseString(minim)
nodeList = dom.getElementsByTagName('AttrValue')
for j in range(len(nodeList)):
    resultado.append(dom.getElementsByTagName('AttrValue')[j].firstChild.wholeText)
    print(resultado[j])

logout = _client.service.logout(sid)
来自zeep导入客户端的

导入xml.dom.minidom
从xml.dom.minidom导入节点
def select():
resultado=[]
sid=_client.service.login(“用户”、“密码”)
objectType='cr'
whereClause=“group.last_名称,如'EUS_ZONA%”和开放日期>1517454000
和开放日期<
1519786800"
maxRows=-1
属性=[“ref_num”
,“agt.id”
“优先权”
,“pcat.id”
,“tenant.id”
,“租户名称”
,“日志代理”
,“请求人姓名”
,“请求人。姓氏”
,“客户名”
,“客户姓氏”
,“customer.id”
,“category.id”
,“category.sym”
,“status.sym”
,“group.id”
,“组。姓氏”
,“zreporting_met.id”
,“zreporting_met.sym”
,“受让人.组合名称”
,“开放日”
,“结束日期”
,“说明”
,“摘要”]
minim=_client.service.doSelect(sid=sid,objectType=objectType,
whereClause=whereClause,maxRows=maxRows,attributes=attributes)
dom=xml.dom.minidom.parseString(minim)
nodeList=dom.getElementsByTagName('AttrValue')
对于范围内的j(len(节点列表)):
append(dom.getElementsByTagName('AttrValue')[j].firstChild.wholeText)
打印(结果为[j])
注销=_client.service.logout(sid)
这只打印第一个AttrValue(ref_num value),我需要做的是在resultado数组中添加XML文件的每个字段,我需要帮助打印XML文件中的每个字段,有人可以帮我吗

请阅读并跟随。 您应该删除所有服务器内容并减少示例数据的大小


此代码段跟随您的代码,获取所有
属性
元素,然后迭代这些元素:

import xml.dom.minidom
from xml.dom.minidom import Node

minim = """<?xml version="1.0" encoding="UTF-8"?>
<udsobjectlist>
    <udsobject>
        <handle>cr:908715</handle>
        <attributes>
            <attribute datatype="2002">
                <attrname>ref_num</attrname>
                <attrvalue>497131</attrvalue>
            </attribute>
            <attribute datatype="2002">
                <attrname>support_lev.sym</attrname>
                <attrvalue/>
            </attribute>
            <attribute datatype="2004">
                <attrname>open_date</attrname>
                <attrvalue>1516290907</attrvalue>
            </attribute>
        </attributes>
    </udsobject>
</udsobjectlist>
"""

dom = xml.dom.minidom.parseString(minim)
nodeList = dom.getElementsByTagName('attribute')

resultado = []
attributes = ["attrname", "attrvalue"]
for node in nodeList:
    a = []
    for attribute in attributes:
        try:
            a.append( node.getElementsByTagName(attribute)[0].firstChild.wholeText)
        except AttributeError:
            a.append("")
    resultado.append(a)
print(resultado)

更接近您的代码:

nodeList = dom.getElementsByTagName('attrvalue')
for node in nodeList:
    try:
        v = node.firstChild.wholeText
        resultado.append(v)
        print(v)
    except:
        pass
print(resultado)
印刷品

[['ref_num', '497131'], ['support_lev.sym', ''], ['open_date', '1516290907']]
497131
1516290907
['497131', '1516290907']
ref_num
497131
support_lev.sym
None
open_date
1516290907

正如评论中所建议的,使用ET(虽然您可能不应该通过索引访问元素,但这可能会让您开始):

印刷品

[['ref_num', '497131'], ['support_lev.sym', ''], ['open_date', '1516290907']]
497131
1516290907
['497131', '1516290907']
ref_num
497131
support_lev.sym
None
open_date
1516290907

-xml就是这样开始的?这里使用
minidom
有什么原因吗?正如文档所解释的,它是XML包中最不友好的一个,除非你已经是DOM(过时版本)方面的专家,我猜你不是。@abarnert你能给我推荐另一个吗?也许更容易使用?你有没有读过这些文档?就在顶部,它说“那些还没有精通DOM的用户应该考虑使用这个模块来进行XML处理。”内置到STDLIB中,但是如果你从头开始学习的话,ETree通常是最好的。人们在实践中使用的主要替代方案是第三方库lxml和BeautifulSoup。(它变得复杂了,因为BeautifulSoup使用lxml作为解析器,lxml的两个API中有一个是ETree的克隆……但是所有的变体都非常友好。)@DibuEscobedo您想要的编辑是不正确的,我的代码片段不会产生那个输出!