我有一个名为CustomerDetails的类,并且我在System.Collections. Generics.List(OfCustomerDetails)中管理这些对象。
Private Sub CustomerDetailsExportToXml(Details As System.Collections.Generic.List(Of CustomerDetails))
Dim x As New System.Xml.Serialization.XmlSerializer(Details.GetType)
Using s As New FileStream("customerdetails.xml", FileMode.Create)
x.Serialize(s, Details)
End Using
End Sub
...并获取普通XML...
<?xml version="1.0"?>
<ArrayOfCustomerDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<CustomerDetails>
<Acronym>MSD</Acronym>
<FriendlyName>Main Street Diner</FriendlyName>
</CustomerDetails>
</ArrayOfCustomerDetails>
为了提高可读性,我想向CustomerDetails标记添加一个名为“Acronym”的属性,该属性将包含标记的值:
<CustomerDetails Acronym="MSD">
我可以在加载/修改/保存Xml的后序列化方法中这样做,但我担心生成的Xml不可反序列化。属性的添加可以在序列化时完成吗?
2条答案
按热度按时间qvtsj1bj1#
既然你已经有了和 element 相同值的
Acronym
,那么让序列化器为你做这件事应该很简单。要将其作为一个属性,您只需 ask:
您也可以通过手动配置序列化器来完成这项工作,而不需要属性,但是这要做很多工作。
ycl3bljg2#
Marc Gravell's answer要简洁得多,并保留了它,因此也可以轻松地对其进行反序列化。
下面是使用XmlAttribute装饰器的小技巧:https://dotnetfiddle.net/6T0U4d
我可以在加载/修改/保存Xml的后序列化方法中这样做,但我担心生成的Xml不可反序列化。属性的添加可以在序列化时完成吗?
这是正确的。如果你弄乱了序列化输出,那么它就不太可能是可反序列化的。
然而,你所要求的可以通过以下步骤很容易地完成:
1.可以使用
StringWriter
而不是FileStream
来获取内存中字符串形式的输出1.获取XML文本并将其加载到
XDocument
1.循环遍历ArrayOfCustomerDetails元素中的CustomerDetails元素
1.将属性值设置为Acronym元素值
1.删除Acronym元素
1.将XDocument XML保存到文件中
例如:
小提琴:https://dotnetfiddle.net/kAz5Ol
您可以通过反转该过程来使反序列化工作。