C# 如何使用属性序列化字符串值列表
我有个问题。如何序列化同时具有属性的字符串项列表C# 如何使用属性序列化字符串值列表,c#,xml,serialization,xml-serialization,C#,Xml,Serialization,Xml Serialization,我有个问题。如何序列化同时具有属性的字符串项列表 <xml> <metadata> <entry key="key1">string1</entry> <entry key="key2">string2</entry> <entry key="key3">string3</entry> </metadata> </xml
<xml>
<metadata>
<entry key="key1">string1</entry>
<entry key="key2">string2</entry>
<entry key="key3">string3</entry>
</metadata>
</xml>
string1
string2
弦3
我知道如何在没有属性的情况下做到这一点,但我不知道如何在我的情况下做到这一点:
[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
[XmlArray(ElementName = "metadata")]
[XmlArrayItem(ElementName = "entry")]
public List<string> Metadata { get; set; }
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}
类似的东西可能适用
class Entry{
[XmlAttribute("key")]
public string key {get;set;}
[XmlText]
public string entry{get;set;}
}
[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
[XmlArray(ElementName = "metadata")]
[XmlArrayItem(ElementName = "entry")]
public List<Entry> Metadata { get; set; }
}
类条目{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串项{get;set;}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}
您需要引入一个类来表示条目
,该类允许您提取键
属性和值
public class Entry
{
[XmlAttribute("key")]
public string Key { get; set; }
[XmlText]
public string Value { get; set; }
}
[XmlRoot(ElementName="xml")]
public class MyXml
{
[XmlArray("metadata")]
[XmlArrayItem("entry")]
public List<Entry> Metadata { get; set; }
}
公共类条目
{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串值{get;set;}
}
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(“元数据”)]
[XmlArrayItem(“条目”)]
公共列表元数据{get;set;}
}
您的元数据
列表应定义一个名为条目
的新类型,该类型应如下所示
[Serializable]
public class Entry
{
[XmlAttribute]
public string Key { get; set; }
[XmlText]
public string value { get; set; }
}
这是你的主要课程
class Program
{
static void Main(string[] args)
{
MyXml xml = new MyXml();
xml.Metadata.Add( new Entry(){Key = "test","content"});
}
}
[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
[XmlArray(ElementName = "metadata")]
[XmlArrayItem(ElementName = "entry")]
public List<Entry> Metadata { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
MyXml=新的MyXml();
添加(新条目(){Key=“test”,“content”});
}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}
您需要创建一个单独的类来保存XmlAttribute
和XmlText
public class Entry
{
[XmlAttribute("key")]
public string Key { get; set; }
[XmlText]
public string Value { get; set; }
}
[Serializable]
[XmlRoot(ElementName = "xml")]
public class MyXml
{
[XmlArray(ElementName = "metadata")]
[XmlArrayItem(ElementName = "entry")]
public List<Entry> Metadata { get; set; }
}
公共类条目
{
[XmlAttribute(“键”)]
公共字符串密钥{get;set;}
[XmlText]
公共字符串值{get;set;}
}
[可序列化]
[XmlRoot(ElementName=“xml”)]
公共类MyXml
{
[XmlArray(ElementName=“metadata”)]
[XmlArrayItem(ElementName=“entry”)]
公共列表元数据{get;set;}
}
然后,您可以选择序列化程序对其进行序列化
var item = new MyXml
{
Metadata = new List<Entry>
{
new Entry { Key = "key1", Value = "entry1" },
new Entry { Key = "key2", Value = "entry2" },
new Entry { Key = "key3", Value = "entry3" }
}
};
var serializer = new XmlSerializer(typeof(MyXml));
string xml;
using(var stream = new StringWriter())
using(var writer = XmlWriter.Create(stream,
new XmlWriterSettings { Indent = true }))
{
serializer.Serialize(writer, item);
xml = stream.ToString();
}
Console.WriteLine(xml);
var item=newmyxml
{
元数据=新列表
{
新条目{Key=“key1”,Value=“entry1”},
新条目{Key=“key2”,Value=“entry2”},
新条目{Key=“key3”,Value=“entry3”}
}
};
var serializer=newxmlserializer(typeof(MyXml));
字符串xml;
使用(var stream=new StringWriter())
使用(var writer=XmlWriter.Create)(流,
新的XmlWriterSettings(缩进=true})
{
序列化器。序列化(编写器,项);
xml=stream.ToString();
}
Console.WriteLine(xml);
结果:
<?xml version="1.0" encoding="utf-16"?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<metadata>
<entry key="key1">entry1</entry>
<entry key="key2">entry2</entry>
<entry key="key3">entry3</entry>
</metadata>
</xml>
入口1
入口2
入口3