将自定义XML解析为JSON或Pandas DataFrame。 (蟒蛇)

时间:2016-08-25 14:53:29

标签: python json xml pandas xml-parsing

以下是我的xml文档。

<BizTalk xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Body>
<QUEUE>
  <FILTER FILTERNAME="CorrectAddress" VALUE="1" />
  <FILTER FILTERNAME="DaysSinceLastTracking" VALUE="0" />
  <FILTER FILTERNAME="DaysSinceShipped" VALUE="3" />
  <FILTER FILTERNAME="DaysUntilDelivered" VALUE="735101" />
  <FILTER FILTERNAME="DeliveryStatus" VALUE="IN_TRANSIT" />
  <FILTER FILTERNAME="Division" VALUE="71" />
  <FILTER FILTERNAME="EmptyBox" VALUE="0" />
  <FILTER FILTERNAME="FedVendInstructions" VALUE="" />
  <FILTER FILTERNAME="ItemDescription" VALUE="bla bla bla" />
  <FILTER FILTERNAME="ItemIssue" VALUE="Damaged" />
  <FILTER FILTERNAME="ItemValue" VALUE="50" />
  <FILTER FILTERNAME="PiecedSet" VALUE="0" />
  <FILTER FILTERNAME="HasProofOfDelivery" VALUE="0" />
  <FILTER FILTERNAME="RecievedPOD" VALUE="0" />
  <FILTER FILTERNAME="RequestedAction" VALUE="Reship" />
  <FILTER FILTERNAME="HasReturntracking" VALUE="0" />
  <FILTER FILTERNAME="IsStandardFillLocation" VALUE="1" />
  <FILTER FILTERNAME="Tampered" VALUE="0" />
  <FILTER FILTERNAME="HasTracking" VALUE="1" />
  <FILTER FILTERNAME="ShortName" VALUE="BDD" />
  <FILTER FILTERNAME="IsBOPS" VALUE="0" />
  <FILTER FILTERNAME="WrongItemType" VALUE="" />
</QUEUE>
<RESPONSEDATA>
  <ITEMS>
    <DATA CanReOrder="1" UPC="xxxxxxx" Quantity="1" LineNumber="1" Description="bla bla bla" />
  </ITEMS>
  <DATA ITEM="Reservation" VALUE="????????" />
  <DATA ITEM="ShipmentNumber" VALUE="1" />
  <DATA ITEM="ContactedBy" VALUE="Shipping Customer" />
  <DATA ITEM="PackageRecieved" VALUE="1" />
  <DATA ITEM="CheckedEverywhere" VALUE="0" />
</RESPONSEDATA>

如何将此自定义XML转换为Pandas DataFrame?

我使用xmljson尝试了一些预定义的覆盖,这会引发错误“str object没有属性标记”

我尝试使用ELementTree并将元素树对象列表传递给Pandas,它会抛出空的Dataframe:

etree = ET.fromstring(xml_data)
df = pd.DataFrame(list(etree))
print(df)

我目前正在计划编写自定义Parser,它将 FilterName 作为列名称,将Value作为其字段,但这是硬编码。我想在将来避免这件事,好像添加了更多的字段,我将不得不手动添加它们,这很麻烦。

是否有某些方法可以遍历每一行(可以使用Loop with Open完成)。并动态地向Pandas DataFrame添加列?

或者有一些有效的方法吗?

注意:我在W3Schools上检查了XML的有效性,它说没有发现错误,所以我相信XML是有效的。

由于

1 个答案:

答案 0 :(得分:1)

很酷,我找到了解决方法。我做了以下事情:

df = pd.DataFrame()

etree = ET.fromstring(xml_data)
# root = etree.getroot()
for node in etree.findall('.//FILTER'):
    parent = node.attrib.get('FILTERNAME')
    child = node.attrib.get('VALUE')

    col_name = parent
    val = child

    df[col_name] = [val]

打印(DF)

只是想张贴,以便任何人都面临类似的问题,它可以提供帮助。感谢