Home > Blockchain >  How to parse xml with python
How to parse xml with python

Time:12-23

I have these xml code:

<?xml version="1.0" encoding="utf-8"?>
<TAB xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FOLD.xsd">
    <FOLD SERVER="APPLE" VERSION="520" OPERATIVE_SYSTEM="HPUX" FOLD_NAME="CAR" MODIFIED="False" UPL="20211123135822UTC" FOLD_ORDER_METHOD="SYSTEM" REAL_FOLD_ID="154" TYPE="1" USED_BY_CODE="0">
        <JOB ID="443" APPLICATION="CAR" SUB_APPLICATION="SENDGEST" NAMEJO="SESA" CREATED_BY="USERA" USER="DMMM" CRITICAL="0" TASKTYPE="Dummy" CON="0" MXX="0" MRU="0" WD="0,1,2,3,4,5,6" JAN="1" FEB="1" MAR="1" APR="1" MAY="1" JUN="1" JUL="1" AUG="1" SEP="1" OCT="1" NOV="1" DEC="1" DAYS_AND_OR="O" SHIFT="Ignore Job" SHIFTNUM=" 00" SYSDB="1" IND_CYCLIC="S" CREATION_USER="USERA" CREATION_DATE="20190829" CREATION_TIME="172439" CHANGE_USERID="USERA" CHANGE_DATE="20200826" CHANGE_TIME="103905" RULE_BASED_CALENDAR_RELATIONSHIP="O" APPL_TYPE="OS" MULTY_AGENT="N" USE_INSTREAM_JCL="N" VERSION_OPCODE="N" CV="Y" VERSION_SERIAL="5">
            <OUT NAME="SESA-TO-SESB" ODATE="ODAT" SIGN=" " />
        </JOB>
        <JOB ID="444" APPLICATION="CAR" SUB_APPLICATION="SENDGEST" NAMEJO="SESB" CREATED_BY="USERA" USER="TO_CAR_P" CRITICAL="0" TASKTYPE="Job" CYCLIC="1" HOST="AFBFTP" INT="00001M" CON="0" RET="0" MW="0" RR="0" AUTOARCH="1" MXX="0" MRU="0" TIMEFROM="0500" TIMETO="0455" WD="0,1,2,3,4,5,6" JAN="1" FEB="1" MAR="1" APR="1" MAY="1" JUN="1" JUL="1" AUG="1" SEP="1" OCT="1" NOV="1" DEC="1" DAYS_AND_OR="O" SHIFT="Ignore Job" SHIFTNUM=" 00" SYSDB="1" IND_CYCLIC="S" CREATION_USER="USERA" CREATION_DATE="20190829" CREATION_TIME="172439" CHANGE_USERID="USERA" CHANGE_DATE="20200826" CHANGE_TIME="103905" RULE_BASED_CALENDAR_RELATIONSHIP="O" APPL_TYPE="FILE_TRANS">
            <VAR NAME="PATH" VALUE="NOTAPPLICABLE" />
            <VAR NAME="ACC" VALUE="TO_CAR_P" />
        </JOB>
    </FOLD>
</TAB>

I'm trying to get VAR NAME PATH (only some jobs have these element) with python but I can't extract. I do:

with open(file1, 'rt') as f:

    tree = ElementTree.parse(f)
for movie in root.iter('JOB.PATH'):
    print(movie.attrib)

Any help please? Thanks

CodePudding user response:

You could search for a VAR nodes and check their PATH

for movie in root.iter("VAR"):
    if movie.attrib["NAME"] == "PATH":
        print("you got me!")

Or using findall

for movie in root.findall(".//VAR/[@NAME='PATH']"):
    print(movie.attrib)

CodePudding user response:

I think beautifulsoup is much easier.

from bs4 import BeautifulSoup

with open(file1, 'rt') as f:
    soup = BeautifulSoup(f, "xml")
for var in soup.find_all("VAR", NAME="PATH"):
    print(var)

CodePudding user response:

Once you got tree, you can use Xpath notation to search:

for node in tree.iterfind(".//JOB/VAR[@NAME='PATH']"):
    print(node.attrib)

Output:

{'NAME': 'PATH', 'VALUE': 'NOTAPPLICABLE'}
  • Related