#python #xml #pandas
#python #xml #панды #pandas
Вопрос:
Привет, я пытаюсь преобразовать свои xml-данные в фрейм данных pandas, но не могу проанализировать все данные. это XML-файл размером 13 мб.
Я хочу извлечь текст внутри «nodeName», я пробовал различные другие способы дерева элементов, но потерпел неудачу. Ниже мой XML выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Ib440ConfigGetResponse xmlns="http://Airspan.Netspan.WebServices">
<Ib440ConfigGetResult>
<ErrorCode>OK</ErrorCode>
<NodeResult>
<NodeResultCode>OK</NodeResultCode>
<NodeName>INAPKVLIVGLRTW6001ENBIB5004</NodeName>
<Ib440Config>
<Name>INAPKVLIVGLRTW6001ENBIB5004</Name>
<Hardware>iBridge 440-221</Hardware>
<Description>I-AP-KVLI-ENB-6001</Description>
<ManagedMode>Managed</ManagedMode>
<Site>Kavali</Site>
<Region>Andhra Pradesh</Region>
<NbifEventAlarmForwarding>Enabled</NbifEventAlarmForwarding>
<ConfigMode>OptimizedModeC</ConfigMode>
<MediumAccessMethod>CSMA</MediumAccessMethod>
<WirelessProtocol>802.11n</WirelessProtocol>
<HtSupportedMcs>MCS0-15</HtSupportedMcs>
<VhtSupportedMcs>MCS0-7</VhtSupportedMcs>
<CellRadiusRange>Short</CellRadiusRange>
<GuardInterval>Long</GuardInterval>
<Frequency>5850</Frequency>
Ниже приведен небольшой код, который я пробую, но он показывает только 4 строки.
import pandas_read_xml as pdx
import pandas as pd
df = pdx.read_xml('1111s.xml')
df
Ответ №1:
Я бы BeautifulSoup
попробовал.
Вы могли бы прочитать xml-файл как объект bs4, а затем использовать методы bs4 для получения необходимых вам атрибутов (и преобразовать результат во фрейм данных).
from bs4 import BeautifulSoup
with open("1111s.xml", "r") as f:
xml_data = f.read()
soup = BeautifulSoup(xml_data, "xml")
soup.find("NodeName").get_text(strip=True)
# 'INAPKVLIVGLRTW6001ENBIB5004'
# in a loop
data = []
for element in soup.find("NodeName").find_next_siblings():
data.append({
"Name": element.find("Name").get_text(strip=True),
"Hardware": element.find("Hardware").get_text(strip=True),
"Site": element.find("Site").get_text(strip=True)
})
pd.DataFrame(data)
Name Hardware Site
0 INAPKVLIVGLRTW6001ENBIB5004 iBridge 440-221 Kavali
Комментарии:
1. просто пример для начала
2. Спасибо, приятель, за вашу любезную поддержку 🙂
Ответ №2:
Просматривая XML, вам нужно будет составить список тегов, по которым вы хотите перемещаться, чтобы добраться до тега «root». Если мне нужно угадать, то:
import pandas_read_xml as pdx
root_tag_list = ['soap:Envelope', 'soap:Body', 'Ib440ConfigGetResponse', 'Ib440ConfigGetResult', 'NodeResult', 'Ib440Config']
df = pdx.read_xml('1111s.xml', root_tag_list)
df
может сработать.
Комментарии:
1. я получаю эту ошибку, TypeError: индексы списка должны быть целыми числами или фрагментами, а не str