Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#XML序列化XMLElement路径_C#_Xml - Fatal编程技术网

C#XML序列化XMLElement路径

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

我目前正在从事一个需要c#Xml序列化的项目

我的问题是: 我有一门课叫ClassA。它有一个Name属性,我想在Xml文件中序列化它

 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>

文本值

我想我会这么做的,这不是一个好的解决方案,但速度最快,没有开销!