向从.NET序列化的对象添加Xml属性

icnyk63a  于 2023-03-04  发布在  .NET
关注(0)|答案(2)|浏览(122)

我有一个名为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不可反序列化。属性的添加可以在序列化时完成吗?

qvtsj1bj

qvtsj1bj1#

既然你已经有了和 element 相同值的Acronym,那么让序列化器为你做这件事应该很简单。

public class CustomerDetails
{
    public string Acronym {get;set;}
}

要将其作为一个属性,您只需 ask

public class CustomerDetails
{
    [XmlAttribute]
    public string Acronym {get;set;}
}

您也可以通过手动配置序列化器来完成这项工作,而不需要属性,但是这要做很多工作。

ycl3bljg

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保存到文件中
例如:

Dim serializer = New XmlSerializer(details.GetType())
Dim xmlLiteral = String.Empty
Using writer = New StringWriter()
    serializer.Serialize(writer, details)
    xmlLiteral = writer.ToString()
End Using

Dim detailsXmlDocument = XDocument.Parse(xmlLiteral)
For Each customerDetailsElement In detailsXmlDocument.Element("ArrayOfCustomerDetails").Elements("CustomerDetails")
    customerDetailsElement.SetAttributeValue("Acronym", customerDetailsElement.Element("Acronym").Value)
    customerDetailsElement.Element("Acronym").Remove()
Next

IO.File.WriteAllText("customerdetails.xml", detailsXmlDocument.ToString())

小提琴:https://dotnetfiddle.net/kAz5Ol
您可以通过反转该过程来使反序列化工作。

相关问题