【发布时间】:2016-11-02 05:50:10
【问题描述】:
我已经尝试了各种可能性,但也许我只是太厌倦了看到解决方案-.-
我有一个这样的 xml 结构:
<diagnosisList>
<diagnosis>
<surgery1>
<date>1957-08-13</date>
<description>a</description>
<ops301>0-000</ops301>
</surgery1>
<surgery2>
<date>1957-08-13</date>
<description>a</description>
<ops301>0-000</ops301>
</surgery2>
<surgery...>
</surgery...>
</diagnosis>
</diagnosisList>
如您所见,手术次数不定。我有一个包含 XML 元素的“手术”类。
class Surgery
{
[XmlElement("date")]
public string date { get; set; }
[XmlElement("description")]
public string description { get; set; }
[XmlElement("ops301")]
public string ops301 { get; set; }
public Surgery()
{
}
}
以及通过将手术类添加到构造函数来创建结构的类诊断。
诊断.cs
class Diagnosis
{
[XmlElement("surgery")]
public Surgery surgery
{
get;
set;
}
public Diagnosis(Surgery Surgery)
{
surgery = Surgery;
}
}
我需要能够通过在序列化之前添加一个数字来动态序列化手术的类名。
有人知道实现这一目标的方法吗?
非常感谢任何帮助:)
亲切的问候 桑德罗
-- 编辑
我从我的根类“Import”开始创建整个结构。然后这个类将被传递给序列化器。所以我不能在创建结构的过程中使用 XMLWriter。我需要先创建整个结构,最后将其序列化:
private static void XmlFileSerialization(Import import)
{
string filename = @"c:\dump\trauma.xml";
// default file serialization
XmlSerializer<Import>.SerializeToFile(import, filename);
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
settings.IndentChars = "\t";
XmlSerializer<Import>.SerializeToFile(import, filename, namespaces, settings);
}
然后在方法“SerializeToFile”中
public static void SerializeToFile(T source, string filename, XmlSerializerNamespaces namespaces, XmlWriterSettings settings)
{
if (source == null)
throw new ArgumentNullException("source", "Object to serialize cannot be null");
XmlSerializer serializer = new XmlSerializer(source.GetType());
using (XmlWriter xmlWriter = XmlWriter.Create(filename, settings))
{
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(T));
x.Serialize(xmlWriter, source, namespaces);
}
}
}
我需要的是能够基于主类“Surgery”实例化可变数量的类。该类必须有一个变量名称,即
手术1、手术2、手术3等
这不能更改,因为这是由定义 XML 结构的机构给出的。
类必须可以通过其动态名称访问,因为必须设置类中的属性。
所以:
surgery1.Property = "blabla";
手术2。属性 = "babla";
等等
我什至在考虑使用T4的方法来创建这部分代码,但是必须有另一种方法来实现动态类名。
我还想过使用反射创建具有类变量名的实例:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
但这实际上不起作用-.-
有没有人有提示可以让我找到正确的方向?
【问题讨论】:
-
你的
Diagnosis类应该有一个Surgery的列表,就像 xml 一样? -
为了实现你的目标,我建议要么实现你自己的反序列化逻辑,要么之前清理你的 xml。
<surgery1>不应该有这些数字。相反,数字应该是 anttribute<surgery Id=1> -
您可以按照how to derive xml element name from an attribute value of a class using annotations? 的方式实现
IXmlSerializable。或者您可以使用[XmlAnyElement]沿线How to deserialize xml elements that have different names, but the same set of attributes to a typed array/collection。 -
感谢您的回复 :) @lokusking 问题是,这是一个机构提供的 XML,我无法更改它 -.- 否则我早就这样做了 :)
-
你的问题变成了两个问题。第一个是关于如何在xml中动态创建名称(我已经给你答案了)。第二个是关于如何在 c# 中动态创建名称 - 你应该单独问这个问题。
标签: c# class serialization dynamic