2016-08-25 29 views
1

以下は私のXML文書です。私はパンダDATAFRAMEにこのカスタムXMLを変換するにはどうすればよいカスタムXMLをJSONまたはPandas DataFrameに解析します。 (Python)

<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> 

は、私はElementTreeのを使用してパンダに要素ツリーオブジェクトのリストを渡してみました

「strのオブジェクトは属性タグを持っていません」というエラーをスローxmljsonを使用して、いくつかの事前定義されたcoversionsを試してみましたが、それが空にアップスローデータフレーム:

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

私は現在、そのフィールドとしてカスタム列名としてFILTERNAMEに取りパーサ、および値を書き込むことを計画していますが、それは、ハードコーディングです。私は将来的にこの事を避けたいのです。もっと多くのフィールドが追加されたかのように、手動で手間をかけて追加する必要があります。

私は各行を繰り返し処理できる方法がありますか(ループで開くことができます)。また、Pandas DataFrameに列を動的に追加しますか?

また、効率的な方法がありますか?

注:XMLの有効性をW3Schoolsにチェックしました。エラーが見つかりませんでしたので、XMLは有効だと思います。

ありがとうございました

答えて

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)

ちょうど誰もが同様の問題に直面しているように、それが助けになることができ、投稿したい:私は次のことをやりました。ありがとうございました

関連する問題