XML - 将属性反序列化为 Xml 子树
Posted
技术标签:
【中文标题】XML - 将属性反序列化为 Xml 子树【英文标题】:XML - Deserialize property as Xml sub-tree 【发布时间】:2021-11-20 13:26:15 【问题描述】:当我反序列化一个 xml 字符串时,我需要在一个名为 prop2
的字符串属性上保存一个 XElement outerXml。
我的 XML:
<MyObj>
<prop1>something</prop1>
<prop2>
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
</RSAKeyValue>
</prop2>
<prop3></prop3>
</MyObj>
我的对象:
public class MyObj
[XmlElement("prop1")]
public string prop1 get; set;
[XmlText]
public string prop2 get; set;
[XmlElement(ElementName = "prop3", IsNullable = true)]
public string prop3 get; set;
我正在使用XmlSerializer
进行反序列化,如下所示:
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(new StringReader(myXmlString));
我尝试使用[XmlText]
将XML 文本保存在prop2
中,但我只得到null
。
我需要做什么才能将<RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent></RSAKeyValue>
中的文本保存在prop2
中?
【问题讨论】:
How to Deserialize XML document的可能重复 @MethodMan 我看不到哪里有重复...在那个问题中,他们需要将每个 xml 元素反序列化为一个属性,但我需要将所有 RSAKeyValue 外部 xml 反序列化为单个属性作为文本字符串 @MethodMan 相信我,我从今天早上开始就已经这样做了。但我的问题是一个特殊的问题。 你不能只有自定义类来读取这个属性(这样做会更容易,如果你仍然需要字符串 - 创建额外的非序列化属性来读取它) @AlexeiLevenkov 我可以,但[XmlText]
不应该这样做吗?因为那时我需要使用prop2
作为字符串,总是。
【参考方案1】:
XmlText
将给出值作为 XML 编码为文本 ("&gt;prop2&lt;..."
) 参见 XmlTextAttribute
默认情况下,XmlSerializer 将类成员序列化为 XML 元素。但是,如果将 XmlTextAttribute 应用于成员,XmlSerializer 会将其值转换为 XML 文本。这意味着该值被编码到 XML 元素的内容中。
一种可能的解决方案 - 使用 XmlNode
作为属性类型:
public class MyObj
[XmlElement("prop1")]
public string prop1 get; set;
public XmlNode prop2 get; set;
[XmlElement(ElementName = "prop3", IsNullable = true)]
public string prop3 get; set;
var r = (MyObj)serializer.Deserialize(new StringReader(myXmlString));
Console.WriteLine(r.prop2.OuterXml);
或者,您可以使整个对象实现自定义 Xml 序列化或具有与 XML 匹配的自定义类型(以正常读取)并具有将该对象表示为 XML 字符串的附加属性。
【讨论】:
我认为他想要 OutterXml 而不是 InnerXml: 内部:public XmlNode prop2 get; set;
我得到异常 There was an error reflecting property 'prop2'
试试[XmlElement] public XmlNode prop2 get; set;
@merthsoft 现在我删除了一些命名空间,例如System.Linq
、System.Runtime.Serialization
和System.Xml.Linq
,现在它可以工作了!
@Ninita - 刚刚注意到我没有从我的示例中删除[XmlText]
,这确实会导致您最初在我的代码中遇到的问题(更新)。仅使用 [XmlElement]
也可以。以上是关于XML - 将属性反序列化为 Xml 子树的主要内容,如果未能解决你的问题,请参考以下文章
使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性
使用 XmlSerializer 将 XML 反序列化为类型
XML 反序列化:在单个属性上使用 XmlAttribute 和 XmlText