Python解析XML嵌套标签转DataFrame报AttributeError问题求助
错误原因
- XML节点是层级嵌套结构,不能直接在
Item节点下查找深层子节点,原代码查找路径错误导致返回None,触发属性错误:Description节点在Descriptions子节点下,不是Item的直接子节点ExtendedProductInformation节点在ExtendedInformation子节点下PackageUOM/QuantityofEaches在Packages -> Package子节点下Length/Width/Height在Package -> Dimensions子节点下Weight在Package -> Weights子节点下- 数字资产相关字段均在
DigitalAssets -> DigitalFileInformation子节点下
- 你提供的XML示例末尾闭合标签是小写的
</items>,和开头的<Items>大小写不匹配,需要改成一致的<Items>否则会触发解析错误 - 原代码中
store_items的字段顺序和cols定义的顺序不一致,会导致最终DataFrame列数据错位
修正后代码
import xml.etree.ElementTree as ETree import pandas as pd xmldata = "0H-2021-09-15-Pies.xml" prstree = ETree.parse(xmldata) root = prstree.getroot() all_items = [] cols = ["ItemLevelGTIN", "PartNumber", "BrandAAIAID", "PartTerminologyID", "Description","ExtendedProductInformation", \ "PackageUOM", "QuantityofEaches", "Length", "Width", "Height", "Weight", "FileName", "AssetType", "FileSize", \ "AssetHeight", "AssetWidth", "FileDateModified", "URI"] for item in root.iter('Item'): # 提取Item下直接子节点 ItemLevelGTIN = item.find("ItemLevelGTIN").text if item.find("ItemLevelGTIN") is not None else None PartNumber = item.find("PartNumber").text if item.find("PartNumber") is not None else None BrandAAIAID = item.find("BrandAAIAID").text if item.find("BrandAAIAID") is not None else None PartTerminologyID = item.find("PartTerminologyID").text if item.find("PartTerminologyID") is not None else None # 提取描述信息 desc_node = item.find("Descriptions/Description") Description = desc_node.text.strip() if desc_node is not None else None # 提取扩展信息 ext_prod_node = item.find("ExtendedInformation/ExtendedProductInformation") ExtendedProductInformation = ext_prod_node.text if ext_prod_node is not None else None # 提取包裹基础信息 package_node = item.find("Packages/Package") PackageUOM = package_node.find("PackageUOM").text if package_node and package_node.find("PackageUOM") is not None else None QuantityofEaches = package_node.find("QuantityofEaches").text if package_node and package_node.find("QuantityofEaches") is not None else None # 提取包裹尺寸 dim_node = package_node.find("Dimensions") if package_node is not None else None Length = dim_node.find("Length").text if dim_node and dim_node.find("Length") is not None else None Width = dim_node.find("Width").text if dim_node and dim_node.find("Width") is not None else None Height = dim_node.find("Height").text if dim_node and dim_node.find("Height") is not None else None # 提取包裹重量 weight_node = package_node.find("Weights/Weight") if package_node is not None else None Weight = weight_node.text if weight_node is not None else None # 提取数字资产基础信息 digital_node = item.find("DigitalAssets/DigitalFileInformation") FileName = digital_node.find("FileName").text if digital_node and digital_node.find("FileName") is not None else None AssetType = digital_node.find("AssetType").text if digital_node and digital_node.find("AssetType") is not None else None FileSize = digital_node.find("FileSize").text if digital_node and digital_node.find("FileSize") is not None else None # 提取数字资产尺寸 asset_dim_node = digital_node.find("AssetDimensions") if digital_node is not None else None AssetHeight = asset_dim_node.find("AssetHeight").text if asset_dim_node and asset_dim_node.find("AssetHeight") is not None else None AssetWidth = asset_dim_node.find("AssetWidth").text if asset_dim_node and asset_dim_node.find("AssetWidth") is not None else None # 提取数字资产其他信息 FileDateModified = digital_node.find("FileDateModified").text if digital_node and digital_node.find("FileDateModified") is not None else None URI = digital_node.find("URI").text if digital_node and digital_node.find("URI") is not None else None # 按cols定义的顺序组装数据 store_items = [ItemLevelGTIN, PartNumber, BrandAAIAID, PartTerminologyID, Description, ExtendedProductInformation, PackageUOM, QuantityofEaches, Length, Width, Height, Weight, FileName, AssetType, FileSize, AssetHeight, AssetWidth, FileDateModified, URI] all_items.append(store_items) xmlToDf = pd.DataFrame(all_items, columns=cols) print(xmlToDf.to_string(index=True))
内容的提问来源于stack exchange,提问作者Sanwal
相关产品推荐
相关产品推荐

