【问题标题】:XML deserialize [closed]XML反序列化[关闭]
【发布时间】:2016-03-01 21:20:03
【问题描述】:

我有一些来自调查系统的 XML。示例结构如下所示:

<?xml version="1.0" encoding="windows-1250" standalone="yes" ?>
<document>
 <ID>100</ID>
 <DOCUMENT_DATA>
  <OWNER>SOME OWNER</OWNER>
  <CODING>WINDOWS-1250</CODING>
  <MAIN_DATA>
   <NAME>JOHN</NAME>
   <SURNAME>DOE</SURNAME>
   <SYSTEM_ID>000</SYSTEM_ID>
   <COUNTRY>GB</COUNTRY>
  </MAIN_DATA>
  <SUB_DATA>
   <STREET>SOME STREET</STREET>
   <BUILDING_NO>120</BUILDING_NO>
   <FLAT_NO>200</FLAT_NO>
   <CITY>LONDON</CITY>
  </SUB_DATA>
  <DESCRIPTION>
   <HAIR>BLACK</HAIR>
   <EYES>BROWN</EYES>
   <BODY>SLIM</BODY>
   <HEIGHT>176</HEIGHT>
   <STATUS>
    <STATUS_NAME>SINGLE</STATUS_NAME>
   </STATUS>
   <SEX>MALE</SEX>
   <TATOO>NO</TATOO>
   <PIERCING>NO</PIERCING>
  </DESCRIPTION>
  <INTEREST>
   <GENERAL>
    <SPORT>
     <MAIN>SURFING</MAIN>
     <TRAINING>EVERY DAY</TRAINING>
    </SPORT>
    <CARS>CLASSIC</CARS>
    <OTHER>MUSIC</OTHER>
   </GENERAL>
   <BOOKS>CRIMINALS</BOOKS>
   <MOVIES>THRILLER</MOVIES>
  </INTEREST>
 </DOCUMENT_DATA>
</document>

我的任务是读取 XML 文件并将其反序列化为 C# 中的对象,使用 System.XML.Serialization 引用和 [XmlAttribute]、[XmlElement] 等标志。 我不熟悉这种技术,因为我通常对 DataSet 类型使用标准和快速的反序列化。 有人可以帮我完成这项任务吗?

【问题讨论】:

  • 您是否尝试研究过"C# XML 序列化"?我确定已经存在数百万个有用的示例?
  • 是的,我已经尝试过了,我什至在这里也看到了一些帮助线程,但是我有很多工作要做,因为我部门的一些同事生病了……正如我所说我不熟悉这种技术。
  • SO 不会为你做你的工作......如果你想这样做的话,你将不得不付出更多的努力来学习如何正确地做到这一点。跨度>
  • 感谢您的帮助 Tdorno。你“非常有帮助”。我看你不明白,有时某人可能处于非常困难的境地。 darth_phoenixx 的回答对我帮助很大,所以......
  • @szataniel 你完成了吗...?那是你的一个方便的链接,所以 darth_phoenixx 提示......是否只有一个 '' 定义还是有很多 '' 然后另一个 '' 需要反序列化为列表的条目

标签: c# xml serialization deserialization


【解决方案1】:

为了快速修复,您可以在 Visual Studio 中创建一个新类,将您的 XML 复制到剪贴板,然后选择“编辑”、“选择性粘贴”、“将 XML 粘贴为类”。

这将自动生成一个类,然后您可以将其用于序列化/反序列化。

不过,正如@Tdorno 所建议的,网站上有很多有用的示例,例如:C# Deserialization xml file

【讨论】:

  • “Paste Special”对我不起作用,但我在网上找到了一些其他 XML 到 C# 转换器,并使用此链接将我的 XML 转换为类结构:link。谢谢你的帮助。
【解决方案2】:

大声笑...我知道有时某人可能处于非常困难的境地 szataniel...。所以,不知道这是否有帮助,但使用您从 XML 创建的类...

        // Deserialize single instance
        XmlSerializer serializerSingle = new XmlSerializer(typeof(ReadXML.Xml2CSharp.Document));//, new XmlRootAttribute("document"));
        using (FileStream stream = File.OpenRead(@"Path to your XML File"))
        {
            // 'ReadXML.Xml2CSharp.Document' is the 'Document' class in your XML Classes
            ReadXML.Xml2CSharp.Document dezerializedXMLSingle = (ReadXML.Xml2CSharp.Document)serializerSingle.Deserialize(stream);
        }
        }

这将在 XML 中反序列化您的“文档”的一个实例...

/////////////////////////////////////// //

要反序列化一个列表,我认为您的 XML 需要有一个像这样的外部根节点(我将对此进行更正)....

<documents>
    <document>
    ...........
    </document>
    <document>
    ...........
    </document>
</documents>

那么您可以使用与上述相同的类...

        // Deserialize to List
        XmlSerializer serializerList = new XmlSerializer(typeof(List<ReadXML.Xml2CSharp.Document>), new XmlRootAttribute("documents"));
        using (FileStream stream = File.OpenRead(@"Path to your XML File"))
        {
            // 'ReadXML.Xml2CSharp.Document' is the 'Document' class in your XML Classes
            List<ReadXML.Xml2CSharp.Document> dezerializedXMLList = (List<ReadXML.Xml2CSharp.Document>)serializerList.Deserialize(stream);
        }

我必须添加一个新的根节点(文档)并设置 XmlRootAttribute("documents") 才能使用从 Xml2CSharp.com 上的 XML 创建的相同类

【讨论】:

  • 是的,我在使用链接转换器后以相同的方式得到它(请将所有 cmets 扩展为我的描述)。感谢您的代码 - 它向我保证,我解决此任务的方法是正确的。 :)
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多