【问题标题】:Deserializing XML where elements and attributes have duplicate names反序列化元素和属性具有重复名称的 XML
【发布时间】:2015-09-24 18:53:24
【问题描述】:

我想反序列化以下 XML。问题是重复的元素名称和属性名称。我试过这个方法 Deserializing duplicate XML elements with unique attributes

但我不断收到:“Account xmlns='' 不是预期的。”

<?xml version="1.0" encoding="utf-8"?>
<Account>
  <Field APIName="WrntyID">1234</Field>
  <Field APIName="ExternalID">4321</Field>
  <Field APIName="CreationDate">07/04/2015 18:28:45</Field>
  <Field APIName="Name"></Field>
  <Field APIName="Phone"></Field>
  <Field APIName="Mobile"></Field>
  <Field APIName="Fax"></Field>
  <Field APIName="Email"></Field>
  <Field APIName="GovID"></Field>
  <Field APIName="Note"></Field>
  <Field APIName="IsActive">True</Field>
  <Field APIName="ConnectedToSuperBiz">False</Field>
  <Field APIName="Street"></Field>
  <Field APIName="City"></Field>
  <Field APIName="State"></Field>
  <Field APIName="Country">USA</Field>
  <Field APIName="ZipCode">33172</Field>
  <Field APIName="Discount">0</Field>
  <Field APIName="PriceLevelName">USD</Field>
  <Field APIName="Prop1"></Field>
  <Field APIName="Prop2"></Field>
  <Field APIName="Prop3"></Field>
  <Field APIName="Prop4"></Field>
  <Field APIName="Prop5"></Field>
  <Agents>
    <Agent>
      <Field APIName="WrntyID">54321</Field>
      <Field APIName="ExternalID"></Field>
    </Agent>
  </Agents>
  <Catalogs>
    <Catalog>
      <Field APIName="WrntyID">12345</Field>
      <Field APIName="ExternalID"></Field>
    </Catalog>
  </Catalogs>
  <Locations>
    <Location>
      <Field APIName="WrntyID">123456</Field>
      <Field APIName="ExternalID">0002</Field>
    </Location>
  </Locations>
  <Contacts>
    <Contact>
      <Field APIName="WrntyID">1234</Field>
      <Field APIName="ExternalID"></Field>
    </Contact>
  </Contacts>
</Account>

我的 C# 类现在看起来像这样。:

[XmlRoot]
    public class Account {        
        public Agents Agents { get; set; }
        public Catalogs Catalogs { get; set; }
        public Locations Locations { get; set; }
        public Contacts Contacts { get; set; }
    }
    public class Agents {
        [XmlArray("Agent")]
        [XmlArrayItem("Field", typeof(Values))]
        public Values[] Field { get; set; }
    }
    public class Catalogs {
        [XmlArray("Catalog")]
        [XmlArrayItem("Field", typeof(Values))]
        public Values[] Field { get; set; }
    }
    public class Contacts {
        [XmlArray("Contact")]
        [XmlArrayItem("Field", typeof(Values))]
        public Values[] Field { get; set; }
    }
    public class Locations {
        [XmlArray("Location")]
        [XmlArrayItem("Field", typeof(Values))]
        public Values[] Field { get; set; }
    }
    public class Values {
        [XmlAttribute("APIName")]
        public string APIName { get; set; }
        [XmlText]
        public string Value { get; set; }
    }  

(为了便于阅读,我省略了一些类) 最大的问题是,是否有不同的反序列化到 C# obj 的方法,或者正确的方法是手动进行映射?

编辑 添加了修改后的类结构,任何人都可以帮助我如何构建类吗?不确定如何处理 Account 中的所有 Field=APIName 元素?

【问题讨论】:

  • 我建议在上面的 XML 中表示的代码中创建一个类。完成此操作后,请使用 XML 序列化程序并查看生成的 XML。然后您会知道 XML 应该 是什么样的?我怀疑它会不会像你提供的那样整洁。
  • 创建一个表示 XML 的类是问题的一部分。不完全确定如何处理 Field 元素。
  • 我建议创建一个名为 Fields 的集合/列表/数组。您需要在帐户中使用其中之一,在代理中需要一个,在目录中需要一个。但是要让它从您提供的 XML 序列化/反序列化,您需要自己自定义序列化/反序列化。网上有很多这样的例子。

标签: c# xml serialization


【解决方案1】:

您没有在 XML 文件中提供 Namespace。

如果没有提供自定义命名空间,XmlRootAttribute 默认为:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"。

尝试告诉您的 XmlReader 不要使用命名空间

 XmlReader reader = new XmlReader() { Namespaces = false };

但是:我强烈建议为您的文件使用特定的命名空间!

【讨论】:

  • 我无法控制我必须读取的文件,我基本上只获取文件夹位置,然后必须读取其中的所有 xml 文件。它可以工作,除了这个 Account XML 文件,因为我无法反序列化它,因为我无法正确构造我的 C# 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多