【问题标题】:Parse custom XML to JSON or Pandas DataFrame. (Python)将自定义 XML 解析为 JSON 或 Pandas DataFrame。 (Python)
【发布时间】:2017-01-02 01:51:20
【问题描述】:

以下是我的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 doesn't have attribute tag”

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

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

我目前正计划编写自定义解析器,它将 FilterName 作为列名,将值作为其字段,但这是硬编码。以后想避免这种事情,好像多了个字段,就得手动加了,很麻烦。

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

或者有什么有效的方法吗?

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

谢谢

【问题讨论】:

    标签: python json xml pandas xml-parsing


    【解决方案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)

    只是想发帖,让任何人遇到类似的问题,它可以提供帮助。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多