Понял, что мои циклы for были написаны неправильно - я пытался вкладывать слишком глубоко, что приводило к неполным результатам. Исправленные ссылки на скрипты:
для br в ldt.findall ("BaseRents"):
вместо:
для br в ldt.findall ("BaseRents / BaseRent"):
Аналогичная структура для FreeRents вернула полный набор результатов. Полный обновленный скрипт:
import xml.etree.ElementTree as ET
import pyodbc
server = "servername, port"
database = "DestDB"
username = "foo"
password = "bar"
con = pyodbc.connect("DRIVER={ODBC Driver 17 for SQL Server};\
SERVER="+server+";DATABASE="+database+";UID="+username+";PWD="+password+";Trusted_Connection=yes;")
x = con.cursor()
tree = ET.parse(r'\\server\FileName.xml')
root = tree.getroot()
for ls in root.findall("PortfolioData/Properties/Property/Spaces/Space/Lease"):
lsid = ls.find("Id").text
for ldt in ls.findall("LeaseDealTerms/LeaseDealTerm"):
ldra = ldt.find("RentableArea").text
try:
unitnum = ldt.find("SourceID").text.split("_")[1]
except:
unitnum = None
secdep = ldt.find("SecurityDeposit").text
nero = ldt.find("NEROverride").text
lsdesc = ldt.find("MiscDescription").text #Jeff asked for this
mtm = ldt.find("IsMonthToMonth").text
moutdt = ldt.find("MoveOutDate").text
try:
retasgw = ldt.find("Retail/AnnualSalesGrowthRate").text
except:
retasgw = None
try:
retpct = ldt.find("Retail/PercentRate").text
except:
retpct = None
try:
retesale = ldt.find("Retail/UnnaturalBreakpoint").text
except:
retesale = None
for br in ldt.findall("BaseRents"):
try:
brstdt = br.find("BaseRent/StartDate").text
except:
brstdt = None
try:
brenddt = br.find("BaseRent/EndDate").text
except:
brenddt = None
try:
bramt = br.find("BaseRent/Amount").text
except:
bramt = None
try:
brunit = br.find("BaseRent/Units").text
except:
brunit = None
for br in ldt.findall("FreeRents"):
try:
frstdt = br.find("FreeRent/StartDate").text
except:
frstdt = None
try:
frenddt = br.find("FreeRent/EndDate").text
except:
frenddt = None
try:
framt = br.find("FreeRent/Amount").text
except:
framt = None
try:
frunit = br.find("FreeRent/Units").text
except:
frunit = None
try:
frtype = br.find("FreeRent/FreeRentType").text
except:
frtype = None
try:
frpct = br.find("FreeRent/Percentage").text
except:
frpct = None
for opex in ldt.findall("OpExs"):
try:
opstdt = opex.find("OpEx/StartDate").text
except:
opstdt = None
try:
openddt = opex.find("OpEx/EndDate").text
except:
openddt = None
try:
opamt = opex.find("OpEx/Amount").text
except:
opamt = None
try:
opunits = opex.find("OpEx/Units").text
except:
opunits = None
for rtax in ldt.findall("RealEstateTaxes"):
try:
rtstdt = rtax.find("RealEstateTax/StartDate").text
except:
rtstdt = None
try:
rtenddt = rtax.find("RealEstateTax/EndDate").text
except:
rtenddt = None
try:
rtamt = rtax.find("RealEstateTax/Amount").text
except:
rtamt = None
try:
rtunits = rtax.find("RealEstateTax/Units").text
except:
rtunits = None
for orev in ldt.findall("OtherRevenues"):
try:
orstdt = orev.find("OtherRevenues/StartDate").text
except:
orstdt = None
try:
orenddt = orev.find("OtherRevenues/EndDate").text
except:
orenddt = None
try:
oramt = orev.find("OtherRevenues/Amount").text
except:
oramt = None
try:
orunits = orev.find("OtherRevenues/Units").text
except:
orunits = None
try:
ortype = orev.find("OtherRevenues/Type").text
except:
ortype = None
if lsid is not None:
x.execute("Insert into portfoliodealterms (lsid, unitnum, ldra, secdep, nero, lsdesc, mtm, moutdt, retasgw, \
retpct, retesale, brstdt, brenddt, bramt, brunit, frstdt, frenddt, framt, frunit, frtype, frpct, opstdt, \
openddt, opamt, opunits, rtstdt, rtenddt, rtamt, rtunits, orstdt, orenddt, oramt, orunits, ortype) \
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, \
?, ?, ?)",
(lsid, unitnum, ldra, secdep, nero, lsdesc, mtm, moutdt, retasgw,
retpct, retesale, brstdt, brenddt, bramt, brunit, frstdt, frenddt, framt, frunit, frtype, frpct, opstdt,
openddt, opamt, opunits, rtstdt, rtenddt, rtamt, rtunits, orstdt, orenddt, oramt, orunits, ortype))
con.commit()