将XML中的数据提取到字典中(1行作为键,下一行作为项)

2024-10-03 23:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML文件,其中包含摘要信息的头和后面的主数据表。我已经将主数据表导出并放入pd.df,但是现在我想将部分头信息提取到字典中。你知道吗

文件示例:

<Workbook>
 <Worksheet>
  <Tables>
   <Row>
    <Cell ss:StyleID="HeadTableTitle" ss:MergeAcross="1"><Data ss:Type="String">Administrative Data</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">ID</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">B013</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">Title</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">Mr</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">Last Name</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">Data</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">First Name</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">Test</Data></Cell>
   </Row>
   <Row/>
   <Row/>
   <Row>
    <Cell ss:StyleID="HeadTableTitle" ss:MergeAcross="1"><Data ss:Type="String">Biological and Medical Baseline Data</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">Height</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">176 cm</Data></Cell>
   </Row>
   <Row>
    <Cell ss:StyleID="HeadTableParameterName" ss:MergeAcross="1"><Data ss:Type="String">Weight</Data></Cell>
    <Cell ss:StyleID="HeadTableParameterValue" ss:MergeAcross="7"><Data ss:Type="String">56.9 kg</Data></Cell>
   </Row>
  </Tables>
 </Worksheet>
</Workbook>

我想做的是将“Administrative data”部分中的数据提取到一个字典中,其中第一个“cell”值作为键(如果我可以删除一些非常棒的空格),第二个“cell”值作为项。然后需要重复这些操作,以便将“生物和医学基线数据”中的数据保存在单独的字典中。词典名称可以是任何名称(例如“subject”和“biomed”)

解析XML文件并访问标记的当前代码:

from lxml import etree

f_path = 'data store/cortex_full.xml'  # enter path of xml file

# open and parse xml file
with open(f_path, 'r', encoding='utf-8') as f:  # set encoding to utf-8 for mac
    root = etree.parse(f)

namespaces = {'o': 'urn:schemas-microsoft-com:office:office',
              'x': 'urn:schemas-microsoft-com:office:excel',
              'ss': 'urn:schemas-microsoft-com:office:spreadsheet'}


ws = root.xpath('/ss:Workbook/ss:Worksheet', namespaces=namespaces)
if len(ws) > 0:
    tables = ws[0].xpath('./ss:Table', namespaces=namespaces)
    if len(tables) > 0:
        rows = tables[0].xpath('./ss:Row', namespaces=namespaces)
        for row in rows:
            cells = row.xpath('./ss:Cell/ss:Data', namespaces=namespaces)

对如何处理这个问题有什么建议吗?如果一本字典不是随意的,也乐意与其他人合作建议。你知道吗


Tags: 文件datastring字典typecellssxpath
1条回答
网友
1楼 · 发布于 2024-10-03 23:21:18

请务必在
之前申报以下内容

subject={}
bio={}
d=None  #If this doesn't work then use d={}

并考虑更换

for row in rows:
   cells = row.xpath('./ss:Cell/ss:Data', namespaces=namespaces)

        for row in rows:
            cells = row.xpath('./ss:Cell', namespaces=namespaces)
            if(len(cells)==2):
              key=None
              item=None
              for cell in cells:
                if(cell.attrib['{urn:schemas-microsoft-com:office:spreadsheet}StyleID']=="HeadTableParameterName"):
                  key=cell.xpath('./ss:Data', namespaces=namespaces)[0].text.strip()
                else:
                  item=cell.xpath('./ss:Data', namespaces=namespaces)[0].text.strip()
              if(not(key==None or item==None)):
                d[key]=item
            elif len(cells)==1:
              if(cells[0].attrib['{urn:schemas-microsoft-com:office:spreadsheet}StyleID']=='HeadTableTitle'):
                if(cells[0].xpath('./ss:Data', namespaces=namespaces)[0].text=='Biological and Medical Baseline Data'):
                  d=bio
                else:
                  d=subject
print(bio)
print(subject)

虽然没有必要,但我已经加入了一些检查,只是为了给出一个想法,但是您可以扩展检查,使其更加健壮。你知道吗

我还有一个工作版本here。你知道吗

相关问题 更多 >