C#XML序列化XMLElement路径
我目前正在从事一个需要c#Xml序列化的项目 我的问题是: 我有一门课叫ClassA。它有一个Name属性,我想在Xml文件中序列化它C#XML序列化XMLElement路径,c#,xml,C#,Xml,我目前正在从事一个需要c#Xml序列化的项目 我的问题是: 我有一门课叫ClassA。它有一个Name属性,我想在Xml文件中序列化它 public class ClassA : BaseClass { [XmlElement("name")] public string Name { get { return GetProperty(() => Name); } set { SetProperty(() => Name, v
public class ClassA : BaseClass
{
[XmlElement("name")]
public string Name
{
get { return GetProperty(() => Name); }
set { SetProperty(() => Name, value); }
}
}
所以当我用这个序列化程序序列化它时
public class PetriNetXMLReader
{
public void SaveToXML(PetriNetXML petriNet, string fileName)
{
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(typeof(PetriNetXML));
System.IO.FileStream file = System.IO.File.Create(fileName);
writer.Serialize(file, petriNet);
file.Close();
}
public PetriNetXML ReadFromXML(string fileName)
{
var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
XmlSerializer deserializer = new XmlSerializer(typeof(PetriNetXML));
return (PetriNetXML)deserializer.Deserialize(fileStream);
}
}
我得到这样一个xml文件
<ClassA Id="5eda8e4c-0698-4e07-9d20-7985964786f9" >
<name>Description</name>
</ClassA>
描述
因此,我的问题是:
我想要一个类似xml的
<ClassA Id="5eda8e4c-0698-4e07-9d20-7985964786f9" >
<name><text>Description</text></name>
</ClassA>
描述
我怎么做这个?我不想为Name属性创建新类
谢谢:)您可以使用XMLReader:
ClassA a = new ClassA();
using (XmlTextReader reader = new XmlTextReader("books.xml"))
{
while (reader.Read())
{
switch (reader.Name)
{
case "text":
//do something with this node, like:
a.Name = reader.Value;
break;
}
}
}
或者,如果您希望坚持对象反序列化,则应该获得与xml类的精确匹配,因此请参考以下内容:
一种可能是将
名称
转换为一个复杂的类;例如:
[XmlElement("name")]
public MyText Name
{
get { return GetProperty(() => Name); }
set { SetProperty(() => Name, value); }
}
然后您可以将MyText
定义为:
public class MyText
{
public string Text {get;set;}
}
您可以实现自定义序列化,ClassA需要实现
ISerializable
。或者,使用iSerializationSubrogate
及其相关接口实现自定义序列化
然而,我不会这么做。这可能比名称有一个包装器类要复杂得多 您可以自定义序列化过程。例如,
ClassA
可以用属性修饰:
public class ClassA : BaseClass, IXmlSerializable
{
[XmlElement("name/text")]
public string Name
{
get { return GetProperty(() => Name); }
set { SetProperty(() => Name, value); }
}
}
然后基类
类应该实现IXmlSerializable
如下:
public class BaseClass : IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
{
XmlElementAttribute elementAttribute = propertyInfo.GetCustomAttribute<XmlElementAttribute>(true);
if (elementAttribute != null)
{
string[] elementNames = elementAttribute.ElementName.Split('/', '\\');
foreach (string elementName in elementNames)
{
reader.ReadStartElement(elementName);
}
propertyInfo.SetValue(this, reader.ReadContentAsString());
foreach (string elementName in elementNames)
{
reader.ReadEndElement();
}
}
}
}
public void WriteXml(XmlWriter writer)
{
foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
{
XmlElementAttribute elementAttribute = propertyInfo.GetCustomAttribute<XmlElementAttribute>(true);
if (elementAttribute != null)
{
string[] elementNames = elementAttribute.ElementName.Split('/', '\\');
foreach (string elementName in elementNames)
{
writer.WriteStartElement(elementName);
}
writer.WriteString(propertyInfo.GetValue(this).ToString());
foreach (string elementName in elementNames)
{
writer.WriteEndElement();
}
}
}
}
protected string GetProperty(Func<string> f)
{
return "text-value";
}
protected void SetProperty<T>(Func<T> f, T value)
{
}
}
公共类基类:IXmlSerializable
{
公共XmlSchema GetSchema()
{
返回null;
}
公共void ReadXml(XmlReader)
{
foreach(PropertyInfo PropertyInfo在此.GetType().GetProperties()中)
{
XmlElementAttribute=propertyInfo.GetCustomAttribute(true);
if(elementAttribute!=null)
{
字符串[]elementNames=elementAttribute.ElementName.Split('/','\\');
foreach(elementNames中的字符串elementName)
{
reader.ReadStartElement(elementName);
}
propertyInfo.SetValue(这是reader.ReadContentAsString());
foreach(elementNames中的字符串elementName)
{
reader.ReadEndElement();
}
}
}
}
public void WriteXml(XmlWriter)
{
foreach(PropertyInfo PropertyInfo在此.GetType().GetProperties()中)
{
XmlElementAttribute=propertyInfo.GetCustomAttribute(true);
if(elementAttribute!=null)
{
字符串[]elementNames=elementAttribute.ElementName.Split('/','\\');
foreach(elementNames中的字符串elementName)
{
writer.writeStarElement(elementName);
}
writer.WriteString(propertyInfo.GetValue(this.ToString());
foreach(elementNames中的字符串elementName)
{
writer.writeedelement();
}
}
}
}
受保护的字符串GetProperty(Func f)
{
返回“文本值”;
}
受保护的void SetProperty(函数f,T值)
{
}
}
序列化的结果将是:
<ClassA>
<name>
<text>text-value</text>
</name>
</ClassA>
文本值
我想我会这么做的,这不是一个好的解决方案,但速度最快,没有开销!