【问题标题】:XML Serialization With Properties inside Tags带有标签内属性的 XML 序列化
【发布时间】:2017-12-18 16:33:15
【问题描述】:

我目前正在与外部公司进行集成,并且交互是使用序列化为 XML 字符串的对象完成的。我给出的示例和来自外部服务的响应包括 XML 标记,这些标记本身带有属性。

即:

<?xml version="1.0" encoding="UTF-8"?>
<Response Version="3">
 <Status StatusCode="OK"></Status>
</Response>

最初我期望“OK”是“Status”标签之间的值,以便将其反序列化为结果对象上的字符串值,但“Status”字段最终为空字符串,我m 假设是因为标签在技术上是空的。

我目前正在尝试使用DataContractSerializer,因为考虑到其他一些单独的要求,它是最合适的,但我不确定如何处理像“状态”示例这样的标签。

DataContractSerializer 是否能够反序列化当前形式的“状态”标签?如果不是,应该使用哪种类型的序列化程序来适应这种情况?

此外,任何有关此 XML 结构的搜索词的资源或帮助将不胜感激。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/4858798/…
  • 那些是属性,不是元素
  • @djv 啊,这解释了谷歌搜索缺乏进度。感谢您澄清这一点。不幸的是,看起来 DataContractSerializer 不支持属性。所以......回到绘图板。
  • DataContractSerializer 确实支持IXmlSerializable,但请参阅here 示例,因此对于非常简单 对象(即只是一个属性),这将是一个选项。但是对于带有子元素的更复杂的对象,实现IXmlSerializable 是残酷的。

标签: .net xml vb.net serialization datacontractserializer


【解决方案1】:

你可以序列化到这些类

Public Class Response
    <System.Xml.Serialization.XmlElement()>
    Public Property Status As Status
    <System.Xml.Serialization.XmlAttribute()>
    Public Property Version As Integer
End Class

Public Class Status
    <System.Xml.Serialization.XmlAttribute()>
    Public Property StatusCode As String
End Class

(Version 和 StatusCode 是属性)

这里是序列化

Dim s As New Xml.Serialization.XmlSerializer(GetType(Response))
Dim r As Response

' reading
Using fs As New IO.FileStream("filename.xml", IO.FileMode.Open)
    r = s.Deserialize(fs)
End Using

' writing
Using fs As New IO.FileStream("filename.xml", IO.FileMode.Truncate)
    s.Serialize(fs, r)
End Using

如果有帮助,xml 也可以这样表示,这应该清楚为什么Status 元素本身没有字符串值。

<?xml version="1.0" encoding="UTF-8"?>
<Response Version="3">
  <Status StatusCode="OK"/>
</Response>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多