我在用Python解析XML字符串时遇到问题

2024-06-10 18:36:06 发布

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

我在使用python解析xml表时遇到问题。我对解析这些类型的文件还不熟悉。我正在使用ElementTree库。我想使用for循环获取“UsedPartTab”表的每一行的特定属性。更具体地说,我想把以下属性赋给一个变量…PartNo,UsedQty,InvoiceNo。我做这件事最好的办法是什么?你知道吗

我尝试在根文档中索引特定标记,但没有成功。我也试过findall,find,get方法。你知道吗

    def GetPartsUsedList():
        request = GET_TICKET_INFO
        response = requests.post(url=GSPN_URL, verify=False, proxies=proxies, headers={"content-type": "text/xml;charset=UTF-8", "SOAPAction": '"www.samsungasc.com/GetTicketInfo"'}, data=request)
        xml = ET.fromstring(response.text)
        root = xml[0][0][0]
        print(root.text)

GetPartsUsedList()

<?xml version="1.0" encoding="utf-8" ?>
<rootdoc>
    <RetCode>0</RetCode>
    <ErrMsg></ErrMsg>
    <Carrier></Carrier>
    <CarrierName></CarrierName>
    <TicketNo>4149142579</TicketNo>
    <SCode1>01</SCode1>
    <SCode2></SCode2>
    <SCode3></SCode3>
    <SCode4>XC</SCode4>
    <IrisDefectCode>ARCS</IrisDefectCode>
    <IrisRepairCode>DPRT</IrisRepairCode>
    <AlertMessage></AlertMessage>
    <HighRisk></HighRisk>
    <Table>
        <Name>UsedPartTab</Name>
        <Column>
            <Name>SeqNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>PartStatus</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>PartNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>Description</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>Location</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>UsedQty</Name>
            <Type>Decimal</Type>
        </Column>
        <Column>
            <Name>RequestNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>PONo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>SONo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>InvoiceNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>InvoiceItemNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>DefectSerialNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>POStatus</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>TrackingNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>TrackingHyperLink</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>PostGoodsIssue</Name>
            <Type>String</Type>
        </Column>
        <ROW>
            <SeqNo>0001</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>0M75P-21-ESGN</PartNo>
            <Description></Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo></InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>N</PostGoodsIssue>
        </ROW>
        <ROW>
            <SeqNo>0002</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>DE26-00126B</PartNo>
            <Description>TRANS H.V;SHV-U1870D,120V,2545,2385V/3.4</Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo>8424097053</InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>P</PostGoodsIssue>
        </ROW>
        <ROW>
            <SeqNo>0003</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>DE60-20066A</PartNo>
            <Description>BOLT-FLAT;MSWR,L100,UNF1/4</Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo>8456512557</InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>P</PostGoodsIssue>
        </ROW>
        <ROW>
            <SeqNo>0004</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>DE94-03275A</PartNo>
            <Description>ASSY PANEL OUTER;MD4,BLACK,P/OUTER+ASSY-</Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo>8456512595</InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>P</PostGoodsIssue>
        </ROW>
        <ROW>
            <SeqNo>0005</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>DE96-00269A</PartNo>
            <Description>ASSY HVC;SMH7175,-,-,0.91UF HVC,-,-</Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo>8456090576</InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>P</PostGoodsIssue>
        </ROW>
    </Table>
    <Table>
        <Name>RecommendedPartTab</Name>
        <Column>
            <Name>PartNo</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>Description</Name>
            <Type>String</Type>
        </Column>
        <Column>
            <Name>Comments</Name>
            <Type>String</Type>
        </Column>
    </Table>

Tags: namestringtypecolumnlocationdescriptioninvoicenoseqno
2条回答

你可以这样试试

import xml.etree.ElementTree as ET
tree = ET.parse('./sample2.xml')
root = tree.getroot()
for table in root.findall('Table'):
    if table.find('Name').text == 'UsedPartTab':
        for child in table.findall('Column'):
            print (child.find('Name').text)

这里

import xml.etree.ElementTree as ET


xml = '''<rootdoc>

    <Table>
        <ROW>
            <SeqNo>0001</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>0M75P-21-ESGN</PartNo>
            <Description></Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo></InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>N</PostGoodsIssue>
        </ROW>
        <ROW>
            <SeqNo>0002</SeqNo>
            <PartStatus>Used</PartStatus>
            <PartNo>DE26-00126B</PartNo>
            <Description>TRANS H.V;SHV-U1870D,120V,2545,2385V/3.4</Description>
            <Location></Location>
            <UsedQty>1</UsedQty>
            <RequestNo></RequestNo>
            <PONo></PONo>
            <SONo></SONo>
            <InvoiceNo>8424097053</InvoiceNo>
            <InvoiceItemNo>0</InvoiceItemNo>
            <DefectSerialNo></DefectSerialNo>
            <POStatus></POStatus>
            <TrackingNo></TrackingNo>
            <TrackingHyperLink></TrackingHyperLink>
            <PostGoodsIssue>P</PostGoodsIssue>
        </ROW></Table></rootdoc>
  '''
root = ET.fromstring(xml)
fields = ['PartNo', 'UsedQty', 'InvoiceNo']
rows = root.findall('.//Table/ROW')
for row in rows:
    for field in fields:
        val = row.find('./{}'.format(field)).text
        print('{} : {}'.format(field,val))

输出

PartNo : 0M75P-21-ESGN
UsedQty : 1
InvoiceNo : None
PartNo : DE26-00126B
UsedQty : 1
InvoiceNo : 8424097053

相关问题 更多 >