将 XML 部分反序列化为对象

2024-01-08

我有一些 XML,我将其反序列化为业务对象。我正在使用 XmlSerializer.Deserialize 来执行此操作。但是,我希望 XML 中包含的 XmlElement 之一保留为 XElement。

由于 XElement 不可序列化,因此无法直接完成(使用 XmlElementAttribute)。我还尝试将该元素序列化为字符串(尝试通过两个步骤获取 XElement),但失败并出现错误:

意外的节点类型元素。 readelementstring方法只能是 用简单的或调用元素 内容为空

知道如何做到这一点吗?

这是 xml 的示例以及我想要的结果对象:

<Person name="Joe">
  <Hobbies>
    <Hobby name="Reading" .../>
    <Hobby name="Photography" .../>
  </Hobbies>
  <HomeAddress>
    ...
  </HomeAddress>
</Person>

Object:

 public class Person
    {
      [XmlAttribute("Name")]
      public string Name {get; set;}
      ?????
      public XElement Hobbies {get; set;}
      [XmlElement("HomeAddress")]
      public Address HomeAddress {get; set;}
    }

无效的尝试:

[XmlElement("Hobbies")]
public XElement Hobbies {get; set;}
[XmlElement("Hobbies")]
public string Hobbies {get; set;}

为了避免实施类似的艰苦工作IXmlSerializable,您可以按照半隐藏传递的方式做一些事情XmlElement财产;但请注意,这并不能完全满足您的要求,因为您只能有一个根XElement值(根据您的示例,不是两个);你需要一个清单来做到这一点......

using System;
using System.ComponentModel;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public class Person
{
    [XmlAttribute("Name")]
    public string Name { get; set; }
    [XmlIgnore]
    public XElement Hobbies { get; set; }

    [XmlElement("Hobbies")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public XmlElement HobbiesSerialized
    {
        get
        {
            XElement hobbies = Hobbies;
            if(hobbies == null) return null;
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(hobbies.ToString());
            return doc.DocumentElement;
        }
        set
        {
            Hobbies = value == null ? null
                : XElement.Parse(value.OuterXml);
        }
    }
    [XmlElement("HomeAddress")]
    public Address HomeAddress { get; set; }
}

public class Address { }

static class Progmam
{
    static void Main()
    {
        var p = new Person { Hobbies = new XElement("xml", new XAttribute("hi","there")) };
        var ser = new XmlSerializer(p.GetType());
        ser.Serialize(Console.Out, p);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 XML 部分反序列化为对象 的相关文章

随机推荐

  • Xcode - 找不到架构 x86_64 的符号(iOS Lib)

    我正在构建一个静态库 构建设置将架构设置为 ARCHS STANDARD 显示为Standard Architectures armv7 armv7s arm64 我选择 iOS 设备构建库 然后使用模拟器 例如 iPhone Retina
  • 两个字符串的比较在android中不起作用[重复]

    这个问题在这里已经有答案了 这是我的代码 Eclipse 没有显示任何错误 程序工作正常 但它根本不完全符合我的要求 View image view danger rate ImageView findViewById R id origi
  • 如何模拟像 new Date() 这样的构造函数

    我有一个方法取决于new Date创建一个日期对象 然后对其进行操作 我正在测试操作是否按预期工作 因此我需要将返回日期与预期日期进行比较 为了做到这一点 我需要确保new Date在测试和正在测试的方法中返回相同的值 我怎样才能做到这一点
  • d3.js - 强制布局边界问题 V4

    目前我正在参与 FCC 的项目之一国家连续性 https www freecodecamp com challenges show national contiguity with a force directed graph 本质上 我能
  • StarDock 的 ModernMix 如何工作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 今天我发现了StarDock的ModernMix 有了它我们可以在经典桌面上运行Windows 8现代应用程序 我们知道它是如何运作的
  • 对列表进行排序,其中某些值保持在固定位置

    我有一个字符串列表 我只想对满足特定条件的值进行排序 考虑这个清单 foo bar testa python java abc 我只想用一个对值进行排序a在他们中 结果应该是这样的 foo abc bar python java testa
  • 如何识别curl请求

    有没有办法在我的脚本中检测请求是来自普通的网络浏览器还是来自执行curl的某些脚本 我可以看到标头 并且可以区分 用户代理和其他几个标头 但在curl中可以设置假标头 所以我无法跟踪请求 请建议我如何识别curl或其他类似的非浏览器请求 捕
  • 如何在严格分层的架构中进行分层并促进模块化而不造成不必要的冗余? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已获准开始为我公司的代码库构建新架构的基础 这一举措的推动力是 我们的代码库已经有十多年的历史了 并且随着我们尝试扩展 终于突破了界
  • 使用 __VA_ARGS__ 定义字符串化宏时出错

    我一直在尝试在 C 中实现一个函数宏 在参数前面加上 DEBUG 并将其参数传递给 printf define DBG format printf DEBUG format n VA ARGS 这在 gcc 中给了我这个错误 src inc
  • 如何配置 DispatcherServlet 和 ContextLoaderListener 以便让位于 OpenViewInSessionFilter

    我在使用 spring 3 0 5 和 hibernate 3 6 1 时遇到了一些问题 在发现我需要一个OpenViewInSessionFilter在一篇帖子中堆栈溢出 https stackoverflow com questions
  • 根据应用于多列的单个条件对数据框进行子集化

    我浏览了该网站上现有的子集问答 但找不到我想要的内容 我想根据一个条件 例如 如果值低于 5 对数据框进行子集化 但是 我只想要所有列中的值都低于 5 的行 例如使用iris数据集 我想选择第 1 3 列的值均低于 5 的所有行 subda
  • 允许每个实例一个代理的最佳 Web 浏览器控件是什么?

    我正在制作一个多线程 workers 应用程序 每个线程都应该有自己的非 GUI Web 浏览器 用于导航到网页并将数据写入字段并单击按钮 我还需要每个网络浏览器都有它自己的代理 我尝试了经典的 Windows Forms WebBrows
  • View 的 getWidth() 和 getHeight() 返回 0

    我看过类似的问题并尝试了他们的解决方案 但它对我不起作用 我正在尝试阅读width of an imageView 但它正在返回0 这是代码 public class MainActivity extends Activity privat
  • Parse.com 相当于 Group By

    我一直在浏览解析论坛 我发现截至 2 年前还没有 SQL Group By 的等效项 我想知道这方面有什么进展吗 我有数千条记录 我需要按价值评级的降序下拉所有记录 然后按名称对它们进行分组 如果目前不可用 也许有人可以建议我可以做一些工作
  • 是否保证C中的数组元素将连续存储,没有填充?

    换句话说 如果我有一个以这种方式分配的数组 是否可以保证 void arr calloc nmemb sizeof some type Then elta eltb eltc都将指向内存中的同一位置 这将是 type 的第二个元素some
  • 如何消除 Spotfire 箱形图中的异常值

    提前感谢您的帮助 问候 拉杰 将值添加到MAX 即使可能 值也会扭曲数据 不过 有两种技巧可以做到这一点 右键单击 gt 属性 gt Y 轴 gt 设置MIN范围值和MAX将值范围设置为可以消除所有异常值的值 这实际上只适用于所有值都彼此接
  • 根据先前的值对 numpy 代码进行向量化操作

    以下代码模拟了一个可以随时采样 3 个不同状态的系统 这些状态之间的恒定转移概率由矩阵给出prob nor 因此 中的每个点trace取决于之前的状态 n states n frames 3 1000 state val np linspa
  • 如何正确使用 Meteor.connect() 与另一个 Meteor 服务器连接

    我的新客户端代码位于 client main coffee Xingyun Meteor connect localhost 3000 System new Meteor Collection system Xingyun Meteor s
  • Java等待函数

    我想知道你们是否可以帮助我 我正在尝试使用 Java 内置的图形模块制作一个动画程序 事实是 Java 立即执行所有操作 不同的动画之间没有任何时间 最终产品只是最后一张图片 我需要一个在每张图片之间放置半秒的功能 任何帮助表示赞赏 规格
  • 将 XML 部分反序列化为对象

    我有一些 XML 我将其反序列化为业务对象 我正在使用 XmlSerializer Deserialize 来执行此操作 但是 我希望 XML 中包含的 XmlElement 之一保留为 XElement 由于 XElement 不可序列化