You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于C#的XML序列化:从现有XML生成过滤后对象结构的方法

从现有XML反序列化生成对象并提取数据的解决方案

嘿,我完全懂你的困惑——网上很多XML序列化的示例都盯着“把对象转成新XML”,但你要的是反过来:把已有的XML转换成对象结构,再从中过滤提取需要的信息,这其实是「反序列化」的活儿,咱一步步来解决:

第一步:定义匹配XML结构的实体类

首先你得创建和XML节点、属性一一对应的类,用序列化特性(比如C#里的XmlRoot、XmlElement、XmlAttribute)来映射关系。针对你给的XML片段,示例类大概是这样:

using System.Xml.Serialization;

// 根节点Z1ZRMPA
[XmlRoot("Z1ZRMPA")]
public class Z1ZRMPA
{
    // 映射节点上的属性,比如SEGMENT、DRUCK这些
    [XmlAttribute("SEGMENT")]
    public string Segment { get; set; }

    [XmlAttribute("XPathMailAdrs")]
    public string XPathMailAdrs { get; set; }

    // 映射子节点,比如POSNR、PARVW等
    [XmlElement("POSNR")]
    public string Posnr { get; set; }

    [XmlElement("PARNR")]
    public string Parnr { get; set; }

    [XmlElement("NAME1")]
    public string Name1 { get; set; }

    [XmlElement("CITY1")]
    public string City1 { get; set; }

    [XmlElement("POST_CODE1")]
    public string PostCode1 { get; set; }

    [XmlElement("STREET")]
    public string Street { get; set; }

    [XmlElement("HOUSE_NUM1")]
    public string HouseNum1 { get; set; }

    [XmlElement("COUNTRY")]
    public string Country { get; set; }

    // 嵌套的Z1ZRMTE节点
    [XmlElement("Z1ZRMTE")]
    public Z1ZRMTE Z1Zrmte { get; set; }
}

// 嵌套的Z1ZRMTE类
public class Z1ZRMTE
{
    [XmlElement("COMM_TYPE")]
    public string CommType { get; set; }

    [XmlElement("TEL_NUMBER")]
    public string TelNumber { get; set; }
}

提示:如果XML里有重复的节点(比如多个Z1ZRMTE),就把对应的属性改成List<Z1ZRMTE>类型,加上[XmlElement("Z1ZRMTE")]即可。

第二步:把现有XML反序列化成对象

接下来用XmlSerializer把你的XML文件(或字符串)转换成上面定义的类实例,代码示例:

using System.IO;
using System.Xml.Serialization;

public Z1ZRMPA DeserializeXmlFromFile(string xmlFilePath)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Z1ZRMPA));
    
    using (FileStream stream = new FileStream(xmlFilePath, FileMode.Open))
    {
        return (Z1ZRMPA)serializer.Deserialize(stream);
    }
}

// 调用示例:
var ownerData = DeserializeXmlFromFile("你的XML文件路径.xml");

如果你的XML是字符串形式,换成StringReader就行:

using (StringReader reader = new StringReader(yourXmlString))
{
    return (Z1ZRMPA)serializer.Deserialize(reader);
}

第三步:过滤提取需要的信息并存入数据库

现在ownerData就是一个普通的C#对象了,你可以像操作任何对象一样筛选、提取数据:

// 提取你需要的字段,比如业主编号、名称、地址
var filteredData = new 
{
    Parnr = ownerData.Parnr,
    CompanyName = ownerData.Name1,
    FullAddress = $"{ownerData.Street} {ownerData.HouseNum1}, {ownerData.PostCode1} {ownerData.City1}, {ownerData.Country}",
    ContactType = ownerData.Z1Zrmte?.CommType
};

// 接下来把filteredData插入数据库,比如用EF或者ADO.NET
// 示例(伪代码):
// dbContext.Owners.Add(new Owner { 
//     Parnr = filteredData.Parnr, 
//     Name = filteredData.CompanyName,
//     Address = filteredData.FullAddress
// });
// dbContext.SaveChanges();

额外注意事项

  • 如果XML包含命名空间,记得在XmlRoot里指定Namespace属性,或者在序列化时设置XmlSerializerNamespaces。
  • 若XML里有一些你不需要的节点/属性,完全可以在类里不定义对应的属性,反序列化时会自动忽略它们,刚好符合你“过滤”的需求。
  • 不同语言的序列化工具逻辑类似:比如Java用JAXB,Python用xmltodict或dataclasses结合xml.etree,核心都是先定义映射类,再把XML转成对象。

内容的提问来源于stack exchange,提问作者Anne Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:06