Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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
解决:使用Python3处理Xml_Python_Xml_Python 3.x - Fatal编程技术网

解决:使用Python3处理Xml

解决:使用Python3处理Xml,python,xml,python-3.x,Python,Xml,Python 3.x,我正在Python3中开发XML处理程序。我的程序输出有问题 我尝试过以任何可能的方式更改for循环,但是输出不是它应该的样子。 由于我是python新手,我知道我在某些地方或某些情况下可能没有考虑到 我的代码如下: import csv import xml.etree.ElementTree as ET def xml_t(inputfile,outputfile): tree = ET.parse(inputfile) root = tree.getroot()

我正在Python3中开发XML处理程序。我的程序输出有问题

我尝试过以任何可能的方式更改for循环,但是输出不是它应该的样子。 由于我是python新手,我知道我在某些地方或某些情况下可能没有考虑到

我的代码如下:

import csv
import xml.etree.ElementTree as ET

def xml_t(inputfile,outputfile):
    tree = ET.parse(inputfile)
    root = tree.getroot()
    for Node in root.iter('Node'):
        nodeName = Node.get('nodeName')
        for LicenseItem in root.iter('LicenseItem'):
            LicenseItem_child = LicenseItem.get('LicenseItem')
            LicenseDesc = LicenseItem.get('LicenseDesc')
            AssignedValue = LicenseItem.get('AssignedValue')
            LicenseStatus = LicenseItem.get('LicenseStatus')
            LicenseEndDate = LicenseItem.get('LicenseEndDate')
            if LicenseItem_child == LicenseDesc == AssignedValue == LicenseStatus == LicenseEndDate == None:
                continue
            output_csv = (nodeName,LicenseItem_child,LicenseDesc,AssignedValue,LicenseStatus,LicenseEndDate)
            with open (outputfile,'a') as files:
                write = csv.writer(files, lineterminator ='\r', delimiter = ',')
                write.writerow(output_csv)


if __name__ == '__main__':
    inputfile = 'filename.xml'
    outputfile = 'output.csv'
    xml_t(inputfile,outputfile)
我期望的输出如下所示:

nodeName,LicenseItem,LicenseDesc,AssignedValue,LicenseStatus,LicenseEndDate
TH1S9303VAS04,,,,,
ES1S9306RANH2,LLE0xxxxx1,NQA Client & NQA Server,1,Normal,PERMANENT
ES1S9306RANH2,LLE0Ixxxx1,IPV6 GTLV2,1,Normal,PERMANENT
ES1S9306RANH2,LLE0xxxxx1,MPLS,1,Normal,PERMANENT
TH1S9303DCN02,LLE0xxxxx1,NQA Client & NQA Server,1,Normal,PERMANENT
TH1S9303DCN02,LLE0xxxxx1,IPV6 GTLV2,1,Normal,PERMANENT
TH1S9303DCN02,LLE0xxxxx1,MPLS,1,Normal,PERMANENT
TH1S5310CSH2,,,,,
TH1S9303DCN01,LLE0yyyyy1,NQA Client & NQA Server,1,Normal,PERMANENT
TH1S9303DCN01,LLE0yyyyy1,IPV6 GTLV2,1,Normal,PERMANENT
TH1S9303DCN01,LLE0yyyyy1,MPLS,1,Normal,PERMANENT
TH1S5310CSH1,,,,,
ES1S9306RANH1,LLE0ttttt1,NQA Client & NQA Server,1,Normal,PERMANENT
ES1S9306RANH1,LLE0ttttt1,IPV6 GTLV2,1,Normal,PERMANENT
ES1S9306RANH1,LLE0ttttt1,MPLS,1,Normal,PERMANENT
,,,,,
我正在处理的XML文件是:

?xml version="1.0" encoding="UTF-8"?>
<LicenseInfo>
    <Node nodeName="TH1S9303VAS04">
        <LicenseItem details="TH1S9303VAS04" />
    </Node>
    <Node nodeName="ES1S9306RANH2">
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S9303DCN02">
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S5310CSH2">
            <LicenseItem details="TH1S5310CSH2" />
    </Node>
    <Node nodeName="TH1S9303DCN01">
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
?xml version=“1.0”encoding=“UTF-8”>
不包含标记“nodeName”的输出正是我想要的,但是当我在输出文件中添加nodeName时,事情开始变得复杂起来

我愿意得到任何帮助。感谢您在这里的advance

(请注意,代码不使用任何外部库)。
代码在有空值的情况下使用“N/A”。你可以替换它

import xml.etree.ElementTree as ET

xml = '''<LicenseInfo>
    <Node nodeName="TH1S9303VAS04">
        <LicenseItem details="TH1S9303VAS04" />
    </Node>
    <Node nodeName="ES1S9306RANH2">
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S9303DCN02">
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S5310CSH2">
            <LicenseItem details="TH1S5310CSH2" />
    </Node>
    <Node nodeName="TH1S9303DCN01">
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    </LicenseInfo>
'''

ATTRS = ['LicenseItem', 'LicenseDesc', 'AssignedValue', 'LicenseStatus', 'LicenseEndDate']

root = ET.fromstring(xml)
nodes = root.findall('.//Node')
lines = []
for node in nodes:
    node_name = node.attrib['nodeName']
    license_items = node.findall('.//LicenseItem')
    for item in license_items:
        line = [node_name]
        for attr in ATTRS:
            line.append(item.attrib.get(attr, 'N/A'))
        lines.append(line)

for l in lines:
    print(l)
此处(请注意,代码不使用任何外部库)。
代码在有空值的情况下使用“N/A”。你可以替换它

import xml.etree.ElementTree as ET

xml = '''<LicenseInfo>
    <Node nodeName="TH1S9303VAS04">
        <LicenseItem details="TH1S9303VAS04" />
    </Node>
    <Node nodeName="ES1S9306RANH2">
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
        <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S9303DCN02">
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0xxxxx1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    <Node nodeName="TH1S5310CSH2">
            <LicenseItem details="TH1S5310CSH2" />
    </Node>
    <Node nodeName="TH1S9303DCN01">
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="NQA Client &amp; NQA Server" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="IPV6 GTLV2" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
            <LicenseItem LicenseItem="LLE0yyyyy1" LicenseDesc="MPLS" AssignedValue="1" LicenseStatus="Normal" LicenseEndDate="PERMANENT" />
    </Node>
    </LicenseInfo>
'''

ATTRS = ['LicenseItem', 'LicenseDesc', 'AssignedValue', 'LicenseStatus', 'LicenseEndDate']

root = ET.fromstring(xml)
nodes = root.findall('.//Node')
lines = []
for node in nodes:
    node_name = node.attrib['nodeName']
    license_items = node.findall('.//LicenseItem')
    for item in license_items:
        line = [node_name]
        for attr in ATTRS:
            line.append(item.attrib.get(attr, 'N/A'))
        lines.append(line)

for l in lines:
    print(l)
iter('nodeName')将返回所有带有标记'nodeName'的节点,因此您的程序将在每个“节点”的所有“LicenseItem”上循环。 您只需按如下所示更改代码,输出将是您想要的:

导入csv
将xml.etree.ElementTree作为ET导入
def xml_t(输入文件、输出文件):
tree=ET.parse(输入文件)
root=tree.getroot()
对于root.iter('Node')中的节点:
nodeName=Node.get('nodeName')
对于节点中的LicenseItem:#唯一的更改是将root.iter()更改为节点
LicenseItem\u child=LicenseItem.get('LicenseItem')
LicenseDesc=LicenseItem.get('LicenseDesc')
AssignedValue=LicenseItem.get('AssignedValue')
LicenseStatus=LicenseItem.get('LicenseStatus')
LicenseEndDate=LicenseItem.get('LicenseEndDate')
如果LicenseItem_child==LicenseDesc==AssignedValue==LicenseStatus==LicenseEndDate==None:
持续
输出\u csv=(节点名、LicenseItem\u子项、LicenseDesc、AssignedValue、LicenseStatus、LicenseEndDate)
打开(outputfile,'a')作为文件:
write=csv.writer(文件,行终止符='\r',分隔符=',')
write.writerow(输出\u csv)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
inputfile='filename.xml'
outputfile='output.csv'
xml_t(输入文件、输出文件)
root.iter('nodeName')将返回所有带有标记'nodeName'的节点,因此您的程序将在每个“节点”的所有“LicenseItem”上循环。 您只需按如下所示更改代码,输出将是您想要的:

导入csv
将xml.etree.ElementTree作为ET导入
def xml_t(输入文件、输出文件):
tree=ET.parse(输入文件)
root=tree.getroot()
对于root.iter('Node')中的节点:
nodeName=Node.get('nodeName')
对于节点中的LicenseItem:#唯一的更改是将root.iter()更改为节点
LicenseItem\u child=LicenseItem.get('LicenseItem')
LicenseDesc=LicenseItem.get('LicenseDesc')
AssignedValue=LicenseItem.get('AssignedValue')
LicenseStatus=LicenseItem.get('LicenseStatus')
LicenseEndDate=LicenseItem.get('LicenseEndDate')
如果LicenseItem_child==LicenseDesc==AssignedValue==LicenseStatus==LicenseEndDate==None:
持续
输出\u csv=(节点名、LicenseItem\u子项、LicenseDesc、AssignedValue、LicenseStatus、LicenseEndDate)
打开(outputfile,'a')作为文件:
write=csv.writer(文件,行终止符='\r',分隔符=',')
write.writerow(输出\u csv)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
inputfile='filename.xml'
outputfile='output.csv'
xml_t(输入文件、输出文件)

太好了,非常感谢,非常感谢,非常感谢,非常感谢,非常感谢