当前位置: 首页 > 知识库问答 >
问题:

C#XmlSerializer和不同标记名的集合

蔺劲
2023-03-14

今天,我从第三方后端获得了更新的XML内容,不得不更改基于XmlSerializer的解析代码,以符合新字段的要求。不幸的是,我发现引入了一组类似的标签,但行为怪异:

<old-root>
  ...
  <contacts>
    <John>Feel happy</John>
    <Mary>Will be away for 2 hours, phone me</Mary>
    <Bob>Do not disturb. I mean it!</Bob>
    ...and so on...
  </contacts>
</root>

到目前为止,我们有一个基于[XmlElement]映射的“old root”解析器类,但我还没有弄清楚如何通过XML注释管理类似名称-值对的集合(类似于[XmlArray]/[XmlArrayItem])。我可以通过[XmlText]注释获得一个值,但是如何注释任何标记呢?“星形”模式对ElementName无效。

P、 我在的UWP子集上。NET框架。

共有1个答案

姜旭
2023-03-14

我可以建议以下方法。对不同的标签使用字典<代码>XmlSerializer无法使用字典,因此请使用XmlIgnore属性标记它,并手动反序列化数据。

[XmlRoot("old-root")]
public class Root
{
    [XmlIgnore]
    public Dictionary<string, string> Contacts { get; set; }
}

首先将xml读入XElement,然后从节点contacts创建字典。删除该节点。然后反序列化此元素中的数据。最后设置之前创建的字典。

var xs = new XmlSerializer(typeof(Root));
Root root = null;
StorageFolder folder = ApplicationData.Current.LocalFolder;

using (var stream = await folder.OpenStreamForReadAsync("test.xml"))
{
    var xml = XElement.Load(stream);
    var contacts = xml.Element("contacts");
    var dict = contacts.Elements().ToDictionary(x => x.Name.LocalName, x => x.Value);
    contacts.Remove();

    root = (Root)xs.Deserialize(xml.CreateReader());
    root.Contacts = dict;
}

它很难看,因为从内存消耗和性能的角度来看,它都效率低下。但它很简单。

 类似资料:
  • 我正在尝试使用liquibase(v3.6.1)redshift库(https://github.com/liquibase/liquiBase-redShift)将UPDATE自动化到我们的redshift集群,但我遇到了一个问题。当Liquibase第一次尝试创建databasechangelog表时,它失败了,因为列名“tag”是RedShift中的保留字。 现在,我找到了这个线程(http

  • LiquiBase:CVC-complex-type.2.4.A:发现以元素'sql'开始的无效内容。应使用“{”http://www.liquibase.org/xml/ns/dbchangelog“:modifysql}”之一。 获取此变更集的错误

  • 问题内容: 我正在成功尝试XmlUnit,对我的工作非常有帮助。现在,我有一个小问题,我不知道如何解决。我有一个Java类,它具有一个Set,并且在将其转换为XML时,其中的元素可以具有任何顺序。 当我在XmlUnit中尝试这两个文件时,它可以工作(Diff说它们是相似的): 但是,当标签具有相同的名称(具有不同的属性)时,它将不起作用(它将属性混合在一起,并期望在另一个标签中使用): 有什么解决

  • 我正在尝试制作一个图形,其中我希望在x轴上有标签和记号,但位置不同。然而,在设置第一个刻度之后,当试图定义新刻度时,之前的刻度似乎被“遗忘”。例如: 到目前为止一切顺利,有了想要的安排<代码> ABC < /代码>用于标记不同的数据点组,它们或多或少地在每个组的中间(我将在后面添加垂直线以使这种分离更加明显),但是蜱应该反映数据,而不是这些人工标签。 但如果我现在尝试向同一轴添加一组不同的记号,则

  • 我是Jackson XML的新手,我需要在同一根元素下构造具有不同元素名称和属性的Jackson XML。 我期望的xml输出 我的pojo类(不确定如何添加剩余的元素和属性) 任何建议都将不胜感激。

  • 我陷入了一个棘手的问题,我应该使用JAXB库取消marshaX输入流,除了XML结构没有帮助。 我的问题是:标记用于值为>的的