前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >将 XML 文件转换为字典形式

将 XML 文件转换为字典形式

原创
作者头像
华科云商小徐
发布2025-03-04 13:28:34
发布2025-03-04 13:28:34
6000
代码可运行
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫
运行总次数:0
代码可运行

在 Python 中,可以使用 xml.etree.ElementTreelxml 库来解析 XML 文件并将其转换为字典形式。

1、问题背景

您有一个 XML 文件,其中的数据结构如下:

代码语言:javascript
代码运行次数:0
复制
  <?xml version="1.0" encoding="utf-8"?>
  <form string="Partners">
    <group col="6" colspan="4">
      <field name="name" select="1"/>
      <field name="ref" select="1"/>
      <field name="customer" select="1"/>
      <field domain="[('domain', '=', 'partner')]" name="title"/>
      <field name="lang" select="2"/>
      <field name="supplier" select="2"/>
    </group>
    <notebook colspan="4">
      <page string="General">
        <field colspan="4" mode="form,tree" name="address" nolabel="1" select="1">
​
​
        </field>
        <separator colspan="4" string="Categories"/>
        <field colspan="4" name="category_id" nolabel="1" select="2"/>
      </page>
      <page string="Sales &amp; Purchases">
        <separator colspan="4" string="General Information"/>
        <field name="user_id" select="2"/>
        <field name="active" select="2"/>
        <field name="website" widget="url"/>
        <field name="date" select="2"/>
        <field name="parent_id"/>
        <newline/>
    <newline/><group col="2" colspan="2" name="sale_list">
        <separator colspan="2" string="Sales Properties"/>
        <field name="property_product_pricelist"/>
    </group><group col="2" colspan="2">
        <separator colspan="2" string="Purchases Properties"/>
        <field name="property_product_pricelist_purchase"/>
    </group><group col="2" colspan="2">
<separator colspan="2" string="Stock Properties"/>
<field name="property_stock_customer"/>
<field name="property_stock_supplier"/>
</group></page>
        <page string="History">
          <field colspan="4" name="events" nolabel="1" widget="one2many_list"/>
        </page>
        <page string="Notes">
          <field colspan="4" name="comment" nolabel="1"/>
        </page>
    <page position="inside" string="Accounting">
    <group col="2" colspan="2">
        <separator colspan="2" string="Customer Accounting Properties"/>
        <field name="property_account_receivable"/>
        <field name="property_account_position"/><field name="vat" on_change="vat_change(vat)" select="2"/><field name="vat_subjected"/>
        <field name="property_payment_term"/>
    </group>
    <group col="2" colspan="2">
        <separator colspan="2" string="Supplier Accounting Properties"/>
        <field name="property_account_payable"/>
    </group>
    <group col="2" colspan="2">
        <separator colspan="2" string="Customer Credit"/>
        <field name="credit" select="2"/>
        <field name="credit_limit" select="2"/>
    </group>
    <group col="2" colspan="2">
        <separator colspan="2" string="Supplier Debit"/>
        <field name="debit" select="2"/>
    </group>
    <field colspan="4" context="address=address" name="bank_ids" nolabel="1" select="2">
​
​
    </field>
</page>
                    </notebook>
  </form>

您想将这个 XML 文件转换为一个字典,以便于您能够以行/列的方式显示数据。字典的格式如下:

代码语言:javascript
代码运行次数:0
复制
{
  "form": {
    "attrs": {
      "string": "Partners"
    },
    "child1": {
      "group": {
        "attrs": {
          "col": "6",
          "colspan": "4"
        },
        "child1": {
          "field": {
            "attrs": {
              "name": "name"
            }
          },
          "child2": {
            "field": {
              "attrs": {
                "name": "ref"
              }
            }
          }
        },
        "child2": {
          "notebook": {
            "attrs": {
              "colspan": 4
            }
          }
        }
      }
    }
  }
}

2、解决方案

为了将 XML 文件转换为字典,您可以使用以下步骤:

  1. 使用 SAX 解析器解析 XML 文件。
  2. 在解析过程中,创建一个字典来存储解析结果。
  3. 当解析到元素开始时,将元素名称和元素属性添加到字典中。
  4. 当解析到元素结束时,将元素名称和元素内容添加到字典中。
  5. 重复步骤 3 和 4,直到解析完整个 XML 文件。

以下是使用 C# 实现如何将 XML 文件转换为字典的代码示例:

代码语言:javascript
代码运行次数:0
复制
  using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Xml;
  using System.Xml.Serialization;
​
  namespace XmlToDictionary
  {
    public class Program
    {
      public static void Main(string[] args)
      {
        // Load the XML file
        string xmlFile = "path/to/xml_file.xml";
        XmlDocument doc = new XmlDocument();
        doc.Load(xmlFile);
​
        // Create a dictionary to store the parsed XML data
        Dictionary<string, object> dictionary = new Dictionary<string, object>();
​
        // Parse the XML file and add the data to the dictionary
        ParseXml(doc.DocumentElement, dictionary);
​
        // Print the dictionary to the console
        Console.WriteLine(PrintDictionary(dictionary));
      }
​
      private static void ParseXml(XmlNode node, Dictionary<string, object> dictionary)
      {
        // Add the node name and attributes to the dictionary
        dictionary.Add(node.Name, GetAttributes(node));
​
        // Add the node content to the dictionary
        if (!string.IsNullOrEmpty(node.InnerText))
        {
          dictionary.Add("content", node.InnerText);
        }
​
        // Parse the child nodes
        foreach (XmlNode childNode in node.ChildNodes)
        {
          ParseXml(childNode, dictionary);
        }
      }
​
      private static Dictionary<string, string> GetAttributes(XmlNode node)
      {
        // Create a dictionary to store the attributes
        Dictionary<string, string> attributes = new Dictionary<string, string>();
​
        // Add the attributes to the dictionary
        foreach (XmlAttribute attribute in node.Attributes)
        {
          attributes.Add(attribute.Name, attribute.Value);
        }
​
        // Return the dictionary
        return attributes;
      }
​
      private static string PrintDictionary(Dictionary<string, object> dictionary)
      {
        // Create a string to store the formatted dictionary
        string output = "";
​
        // Iterate over the dictionary and add the key-value pairs to the string
        foreach (KeyValuePair<string, object> pair in dictionary)
        {
          output += $"{pair.Key}: {pair.Value}\n";
        }
​
        // Return the formatted dictionary
        return output;
      }
    }
  }

运行以上代码,您将得到一个字典,其中包含了 XML 文件中的所有数据。您可以使用这个字典来以行/列的方式显示数据。

总结:

  • 如果你不想安装额外的库,可以使用 Python 标准库 xml.etree.ElementTree
  • 如果需要处理更复杂的 XML 文件,xmltodict 是一个更方便的选择。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档