使用不同类型的行反序列化 XML C#

2023-12-14

反序列化 XML 时遇到问题。无法理解如何制作财产data根据 xml 属性不同idxds 生成一个公共属性data结合了数据 UserInfo + 数据 UserTransactions 的属性

尝试过解决方案this线程但没有运气 XML 示例:

<?xml version="1.0" encoding="UTF-8"?>
<document>
  <data id="UserInfo">
    <rows>
      <row id="123" Name="Alex" phone="+1234567890"></row>
      <row id="321" Name="Sally" phone="+1234567890"></row>
    <rows>
  </data>
  <data id="UserTransactions">
    <rows>
      <row UserId="123" amount="100.1" date="2022-07-03"></row>
      <row UserId="123" amount="-100.1" date="2022-07-03"></row>
      <row UserId="321" amount="1" date="2022-07-03"></row>
    <rows>
  </data>
</document>

问题:是否可以反序列化到某个具有基于 xml 属性的属性的类? 例如有些像:

    public class document
    {
        // based on <data id='UserInfo'>
        public UserInfoRow[] dataUserInfos { get; set; }
        // based on <data id='UserTransaction'>
        public UserTransactionRow[] dataUserTransactions { get; set; }
    }

我尝试过的代码

namespace test
{
    public class document
    {
        [XmlElement("data")]
        public documentData[] data { get; set; }
    }
    public class documentData
    {
        [XmlAttribute("id")]
        public string id { get; set; }

        [XmlArray("rows")]
        [XmlArrayItem("row")]
        public row[] rows { get; set; }
    }

    [XmlInclude(typeof(UserInfoRow)), XmlInclude(typeof(UserTransactionRow))]
    public class row { }
    public class UserInfoRow : row
    {
        [XmlAttribute("id")]
        public string id { get; set; }
        [XmlAttribute("Name")]
        public string Name { get; set; }
        [XmlAttribute("phone")]
        public string phone { get; set; }
    }
    public class UserTransactionRow : row
    {
        [XmlAttribute("UserId")]
        public string UserId { get; set; }
        [XmlAttribute("amount")]
        public string amount { get; set; }
        [XmlAttribute("date")]
        public string date { get; set; }
    }
}

没有来自结束课程的信息

Watch


您不能在 xml 中使用继承的类。继承的类需要 xml 中的 type 属性。相反,您可以使用自定义 IXmlSerialize,如下面的代码

using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;

namespace ConsoleApp2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(test.document));
            test.document doc = (test.document)serializer.Deserialize(reader);
 

        }

    }
 
}
namespace test
{
    public class document
    {        
        [XmlElement("data")]
        public documentData[] data { get; set; }
    }
    public class documentData : IXmlSerializable
    {
        [XmlAttribute("id")]
        public string id { get; set; }

        public List<UserInfoRow> userInfoRows { get; set; }
        public List<UserTransactionRow> userTransactionRows { get; set; }

        public void WriteXml(XmlWriter writer)
        {
 
        }

        public void ReadXml(XmlReader reader)
        {
            id = reader.GetAttribute("id");       
            XmlSerializer serializer = null;
            XmlReader xmlChildReader = null; 
            switch (id)
            {
                case "UserInfo":
                    serializer = new XmlSerializer(typeof(UserInfoRow)) ;
                    xmlChildReader = reader.ReadSubtree();
                    while (xmlChildReader.ReadToFollowing("row"))
                    {     
                        UserInfoRow userRow = (UserInfoRow)serializer.Deserialize(xmlChildReader);
                        if (userInfoRows == null) userInfoRows = new List<UserInfoRow>();
                        userInfoRows.Add(userRow);
                    }
                    break;
                case "UserTransactions":
                    serializer = new XmlSerializer(typeof(UserTransactionRow));
                    xmlChildReader = reader.ReadSubtree();
                    while (xmlChildReader.ReadToFollowing("row"))
                    {
                        UserTransactionRow userRow = (UserTransactionRow)serializer.Deserialize(xmlChildReader);
                        if (userTransactionRows == null) userTransactionRows = new List<UserTransactionRow>();
                        userTransactionRows.Add(userRow);
                    }
                    break;
            }
            reader.ReadEndElement();

        }

        public XmlSchema GetSchema()
        {
            return (null);
        }

    }
    [XmlRoot("row")]
    public class UserInfoRow
    {
        [XmlAttribute("id")]
        public string id { get; set; }
        [XmlAttribute("Name")]
        public string Name { get; set; }
        [XmlAttribute("phone")]
        public string phone { get; set; }
    }
    [XmlRoot("row")]
    public class UserTransactionRow
    {
        [XmlAttribute("UserId")]
        public string UserId { get; set; }
        [XmlAttribute("amount")]
        public string amount { get; set; }
        [XmlAttribute("date")]
        public string date { get; set; }
    }
}

这是另一个更紧凑的解决方案。我删除了 documentData 类

using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;

namespace ConsoleApp2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(test.document));
            test.document doc = (test.document)serializer.Deserialize(reader);
 

        }

    }
 
}
namespace test
{
    public class document : IXmlSerializable
    {        
 
        public string id { get; set; }

        public List<UserInfoRow> userInfoRows { get; set; }
        public List<UserTransactionRow> userTransactionRows { get; set; }

        public void WriteXml(XmlWriter writer)
        {
 
        }

        public void ReadXml(XmlReader reader)
        {
            XmlSerializer serializer = null;
            XmlReader xmlChildReader = null;

            while (reader.ReadToFollowing("data"))
            {

                id = reader.GetAttribute("id");
                switch (id)
                {
                    case "UserInfo":
                        serializer = new XmlSerializer(typeof(UserInfoRow));
                        xmlChildReader = reader.ReadSubtree();
                        while (xmlChildReader.ReadToFollowing("row"))
                        {
                            UserInfoRow userRow = (UserInfoRow)serializer.Deserialize(xmlChildReader);
                            if (userInfoRows == null) userInfoRows = new List<UserInfoRow>();
                            userInfoRows.Add(userRow);
                        }
                        break;
                    case "UserTransactions":
                        serializer = new XmlSerializer(typeof(UserTransactionRow));
                        xmlChildReader = reader.ReadSubtree();
                        while (xmlChildReader.ReadToFollowing("row"))
                        {
                            UserTransactionRow userRow = (UserTransactionRow)serializer.Deserialize(xmlChildReader);
                            if (userTransactionRows == null) userTransactionRows = new List<UserTransactionRow>();
                            userTransactionRows.Add(userRow);
                        }
                        break;
                }
            }

        }

        public XmlSchema GetSchema()
        {
            return (null);
        }

    }
    [XmlRoot("row")]
    public class UserInfoRow
    {
        [XmlAttribute("id")]
        public string id { get; set; }
        [XmlAttribute("Name")]
        public string Name { get; set; }
        [XmlAttribute("phone")]
        public string phone { get; set; }
    }
    [XmlRoot("row")]
    public class UserTransactionRow
    {
        [XmlAttribute("UserId")]
        public string UserId { get; set; }
        [XmlAttribute("amount")]
        public string amount { get; set; }
        [XmlAttribute("date")]
        public string date { get; set; }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用不同类型的行反序列化 XML C# 的相关文章

  • 必须打开存储才能执行此操作 - System.IO.Packaging.Package

    我正在使用 System IO Packaing Package 类来压缩文件 我的应用程序的多个实例可以同时运行 并读取和保存文件 当处理小文件时 一切似乎都很好 但是当涉及大文件时 如果应用程序的两个实例同时保存 我会收到一个异常 消息
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 使用 XPath 获取属性

    给定一个像这样的 XML 结构
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使

随机推荐

  • 如何让 OS X 识别驱动器号?

    我知道 异端 但我陷入了困境 我有很多使用绝对路径名的配置文件 这导致 OS X 和 Windows 之间不兼容 如果我能让 OS X 我敢打赌是两者中更灵活的一个 识别问 foo bar bim properties作为有效的绝对文件名
  • 在 Windows 上使用参数静默运行安装程序 (.exe)

    我有一个 Windows 安装文件 exe 用于安装软件 这是第三方可执行文件 在安装过程中 它需要特定的值并有一个 UI 我想以静默方式运行此 setup exe 无需任何手动干预 即使是提供参数值 在花了一些时间谷歌搜索该方法之后 我觉
  • 根据用户输入编写包含变量 WHERE 的查询

    我在查询时遇到问题 我希望它做的是检查每个变量是否存在 如果不存在则忽略它们 我还想在表格中显示结果 任何帮助将不胜感激 到目前为止我所拥有的 这是我的代码 目前 它返回一个包含数据库中所有结果的数组 但如果我将 WHERE 子句中的 OR
  • 如何从 WSDL URL 生成 WSDL 文件?

    我的问题是我创建了一个网络服务客户端wsimport当创建其服务对象时 由于 HTTPS 它失败了 如下所示 MyService Service service new MyService Service new URL https www
  • 检查 JSON 中是否存在对象

    我需要知道 JSON 字符串中是否存在某个对象 并根据该对象的存在执行不同的操作 如果它不存在 我想省略该对象 因为它会抛出 NullPonterException 我尝试过使用if但没有成功 有人可以告诉我如何检查对象的存在吗 先感谢您
  • Java WAR - 从外部 JAR 加载 Spring bean

    我想在我的 Spring MVC Web 应用程序 打包为 WAR 中加载一些带有注释的 Spring 框架 bean Service来自外部 jar 它负责访问数据库和位于类路径中在 WEB INF lib 下 如果可能的话 最好使用以下
  • Azure DevOps 存储库备份副本 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我们已经创建了存储库https dev azure com 运行良好 现在 我的经理希望定期获得该存储库的备份副本 我向经理解释说https dev
  • 将 div 内的图像与响应高度垂直对齐

    我有以下代码 它设置一个容器 当调整浏览器大小 以保持方形纵横比 时 该容器的高度随宽度而变化 HTML div class responsive container div class dummy div div class img co
  • 如何使用 Meteor 为 MongoDB 提供配置?

    The meteor命令都会启动 Meteor 和 MongoDB 我怎么有meteor启动 MongoDB 时执行与此命令等效的命令mongod profile 1 slowms 1 或者 meteor 使用的某个地方是否有 mongo
  • Symfony ChoiceType $choices - 标签和值交换

    交响乐2 8 2 根据 Symfony 文档 选择选项是一个数组 其中数组键是项目的标签 数组值是项目的值 http symfony com doc 2 8 reference forms types choice html choices
  • qsort 没有对字符串数组进行排序[重复]

    这个问题在这里已经有答案了 我尝试使用 qsort 对字符串数组进行排序 这是我的数组的内容 a orange apple mobile car 这就是我使用 qsort 的方式 int myCompare const void a con
  • 从命令行列出所有环境变量

    是否可以列出all来自 Windows 命令提示符的环境变量 相当于PowerShell的东西gci env or ls env or dir env Just do SET 你也可以做SET prefix查看名称以以下开头的所有变量pre
  • 使用导航菜单显示隐藏 html 代码/内容 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有一个按点击付费 PPC 登录页面 该页面的顶部有一个菜单 主页 服务 关于 我不想有另外两个页面用于服务 关于 我只想更改内容并替换所有内容 包括和之后的内容div class i
  • 矩阵上的垃圾、索引和唯一(如何保持矩阵格式)

    在 8x8 矩阵上使用此方法 gt gt junk index unique data first Capture the index ignore junk gt gt data sort index Index data with th
  • 为什么Java中的String.hashCode()有很多冲突? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 为什么 String ha
  • 无法加载文件或程序集或其依赖项之一。该系统找不到指定的文件。 (GAC 不允许)

    我有一个 主 程序 它使用反射动态加载我自己的 plugin dll 文件 plugin dll 文件通过使用 Visual Studio 引用来引用第三方 device dll 只要 device dll 和 plugin dll 与 M
  • jQuery - 从文本区域选择所有文本

    我怎样才能做到当您在文本区域内单击时 它的整个内容都会被选中 最终 当您再次单击时 取消选择它 为了防止用户在每次尝试使用鼠标移动插入符号时选择整个文本时感到恼火 您应该使用focus事件 而不是click事件 以下内容将完成这项工作并解决
  • Mongoose 和引用 UUID 数组不转换

    使用 mongoose uuid 库时 我可以为模式设置 UUID 类型 因此当我读取数据时 它采用字符串 utf 8 格式 而当我保存数据时 它采用 UUID ObjectID BSON 类型 4 格式 这对于我的架构中的顶级或平面直接值
  • 如何在C++中使用虚函数来实现多态行为?

    我对 C 的这些重要功能很陌生 我已经在这里阅读了有关这些主题的一些问题 答案 并用谷歌搜索了一些文档 但我仍然对此感到困惑 如果有人能给我建议一些好的在线教程或书籍章节 让我轻松而缓慢地理解这个概念 并从基础开始 那就太好了 另外 如果有
  • 使用不同类型的行反序列化 XML C#

    反序列化 XML 时遇到问题 无法理解如何制作财产data根据 xml 属性不同idxds 生成一个公共属性data结合了数据 UserInfo 数据 UserTransactions 的属性 尝试过解决方案this线程但没有运气 XML