【问题标题】:Deserialize an XML in C# generated by XStream from java在 C# 中反序列化由 Java 中的 XStream 生成的 XML
【发布时间】:2013-03-18 13:20:30
【问题描述】:

我的应用程序有 2 个部分,一个 android 客户端和一个用 c# 编码的 windows 打印服务器。

我在 java 中使用 Xstream 将我的对象转换为 XML(在 android 中)。这是其中的一部分:

<ROOT>
  <id>1</id>
  <serial>92000</serial>
  <date>2013/2/15</date>

  <ITEMS>

    <ITEM>
      <name>/**SOMETHING**/</name>
      <idd>/**SOMETHING**/</idd>
      <pd>/**SOMETHING**/</pd>
      <ed>/**SOMETHING**/</ed>
    </ITEM>
    <ITEM>
      <name>/**SOMETHING**/</name>
      <idd>/**SOMETHING**/</idd>
      <pd>/**SOMETHING**/</pd>
      <ed>/**SOMETHING**/</ed>
    </ITEM>
    <ITEM>
      <name>/**SOMETHING**/</name>
      <idd>/**SOMETHING**/</idd>
      <pd>/**SOMETHING**/</pd>
      <ed>/**SOMETHING**/</ed>
    </ITEM>

  </ITEMS>

</ROOT>

如您所见,我有 2 种对象类型,一种 ROOT 对象类型,以及名为 ITEMS 的第二种对象类型的嵌套列表。 我可以读取 ROOT 对象的名称、序列号和日期,但是对于 ITEMS 对象的嵌套列表,它总是返回 null。

c#中Root类的类是:

[XmlRoot("ROOT")]
    public class ROOT_CLASS
    {

        [XmlElement("id")]
        public string idVar{ get; set; }

        [XmlElement("serial")]
        public string serialVar{ get; set; }

        [XmlElement("date")]
        public string dateVar{ get; set; }

        [XmlArray("ITEMS")]
        [XmlArrayItem("ITEM")]
    public List<NESTED_CLASS> oi { get; set; }

    }

这里是嵌套对象类:

[XmlRoot("ITEM")]
    public class NESTED_CLASS
    {
        [XmlElement("name")]
        public string nameVV; { get; set; }
        [XmlElement("idd")]
        public string iddVV; { get; set; }
        [XmlElement("pd")]
        public string pdVV; { get; set; }
        [XmlElement("ed")]
        public string edVV; { get; set; }

    } 

好的,我怎样才能从这个 xml 中反序列化 NESTED_CLASS 列表?正如我所说,我总是从中得到一个空值。请帮我。 谢谢...

【问题讨论】:

    标签: c# android xml serialization xstream


    【解决方案1】:

    使用 XmlArray 属性

    [XmlRoot(ElementName = "ROOT")]
    public class Root
    {
        public int id { get; set; }
        public int serial { get; set; }
        public string date { get; set; }
    
        [XmlArray(ElementName = "ITEMS")]
        [XmlArrayItem("ITEM")]
        public List<RootItem> Items { get; set; }
    }
    
    public class RootItem
    {
        public string name { get; set; }
        public string idd { get; set; }
        public string pd { get; set; }
        public string ed { get; set; }
    }
    

    【讨论】:

    • 我不明白,XML 中没有 ROOTITEM 元素?...请注意 Rookie :D 谢谢。
    【解决方案2】:

    您也可以使用 xsd.exe 生成 C# 类,而不是手动执行此操作。如果此 xml 随时间发生变化,这可能会更容易、更快;而且您不必担心现在遇到的问题。

    请参阅 Generate C# class from XML 了解如何执行此操作的示例。

    请注意,如果您正在处理非常大的 xml 文件,这种方法可能不是最好的方法,因为它将整个 xml 加载到内存中。如果是这种情况,您可能需要改用this 方法。

    【讨论】:

    • 这也是一个不错的方法,非常灵活……但是作为菜鸟,必须一步一步来,在以后的进步中创建灵活的解决方案,但是感谢您的出色回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多