#python #xml #elementtree
#python #xml #elementtree
Вопрос:
Я пытаюсь проанализировать приведенный ниже xml с помощью Python, и ElementTree
, однако, я сталкиваюсь с некоторыми ошибками.
Это код, который я использую прямо сейчас:
tree = file.xml
for house in tree.findall('.//HOUSE'):
HOUSE_ID = house.find('ID').text
ASSET_ID = house.find('ASSET_ID').text
IP = house.find('IP').text
FOLLOW_UP= house.find('FOLLOW_UP').text
NODE_ID= house.find('NODE_ID').text
ADDRESS = house.find('ADDRESS')
if ADDRESS is None:
ADDRESS = ''
else:
ADDRESS = ADDRESS.text
LAST_VISIT_DATETIME = host.find('LAST_VISIT_DATETIME').text
DOMOTIC = house.find('DOMOTIC')
if DOMOTIC is None:
DOMOTIC = ''
else:
DOMOTIC = DOMOTIC.text
ITEM_ID = house.find('ITEM_ID')
if ITEM_ID is None:
ITEM_ID = ''
else:
ITEM_ID = ITEM_ID.text
print(HOUSE_ID "," ASSET_ID "," IP "," FOLLOW_UP "," NODE_ID "," ADDRESS "," LAST_VISIT_DATETIME "," ADDRESS "," LAST_VISIT_DATETIME)
Это XML:
<OUTPUT>
<RESPONSE>
<DATETIME>2020-10-26T11:38:35Z</DATETIME>
<HOUSE_LIST>
<HOUSE>
<ID>10808749</ID>
<ASSET_ID>1234</ASSET_ID>
<IP>192.168.0.1</IP>
<TRACKING_METHOD>IP</TRACKING_METHOD>
<NODE_ID>0</NODE_ID>
<ADDRESS>
<![CDATA[XXX]]>
</ADDRESS>
<LAST_VISIT_DATETIME>2020-08-28T09:16:26Z</LAST_VISIT_DATETIME>
<LAST_COMM_DATE>2020-08-28T08:48:38Z</LAST_COMM_DATE>
<LAST_COMM_DURATION>982</LAST_COMM_DURATION>
<ITEM_LIST>
<ITEM>
<ITEM_ID>13607</ITEM_ID>
<TYPE>Potential</TYPE>
<USAGE>3</USAGE>
<LOCATION>443</LOCATION>
<ABCD>aa</ABCD>>
<ABD>1</ABD>
<DESCRIPTION>
<![CDATA[AAAAAA]]>
</DESCRIPTION>
<STATUS>New</STATUS>
<FIRST_FOUND_DATETIME>2020-08-28T08:48:38Z</FIRST_FOUND_DATETIME>
<LAST_FOUND_DATETIME>2020-08-28T08:48:38Z</LAST_FOUND_DATETIME>
<TIMES_FOUND>1</TIMES_FOUND>
<LAST_TEST_DATETIME>2020-08-28T08:48:38Z</LAST_TEST_DATETIME>
<LAST_UPDATE_DATETIME>2020-08-28T09:16:26Z</LAST_UPDATE_DATETIME>
<IS_IGNORED>0</IS_IGNORED>
<IS_DISABLED>0</IS_DISABLED>
<LAST_PROCESSED_DATETIME>2020-08-28T09:16:26Z</LAST_PROCESSED_DATETIME>
</ITEM>
<ITEM>
Я хотел бы распечатать список элементов в каждом доме, однако он печатает только один из них.
Комментарии:
1. Во-первых, ваш xml неверен; пожалуйста, отредактируйте вопрос и исправьте его. Во-вторых, каков именно ваш ожидаемый результат? В-третьих, можете ли вы использовать lxml вместо ElementTree?
Ответ №1:
Это происходит потому ITEM
, что элементы повторяются внутри HOUSE/ITEM_LIST
, и для печати списка элементов в каждом доме потребуется перебирать ITEM
элементы так же, как вы перебираете HOUSE
элементы:
for item in house.findall('./ITEM_LIST/ITEM'):
ITEM_ID = item.find('ITEM_ID')
if ITEM_ID is None:
ITEM_ID = ''
else:
ITEM_ID = ITEM_ID.text
print(ITEM_ID)