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

我需要做什么才能将&lt;RSAKeyValue&gt;&lt;Modulus&gt;...&lt;/Modulus&gt;&lt;Exponent&gt;...&lt;/Exponent&gt;&lt;/RSAKeyValue&gt; 中的文本保存在prop2 中?

【问题讨论】:

How to Deserialize XML document的可能重复 @MethodMan 我看不到哪里有重复...在那个问题中,他们需要将每个 xml 元素反序列化为一个属性,但我需要将所有 RSAKeyValue 外部 xml 反序列化为单个属性作为文本字符串 @MethodMan 相信我,我从今天早上开始就已经这样做了。但我的问题是一个特殊的问题。 你不能只有自定义类来读取这个属性(这样做会更容易,如果你仍然需要字符串 - 创建额外的非序列化属性来读取它) @AlexeiLevenkov 我可以,但[XmlText] 不应该这样做吗?因为那时我需要使用prop2 作为字符串,总是。 【参考方案1】:

XmlText 将给出值作为 XML 编码为文本 ("&amp;gt;prop2&amp;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.LinqSystem.Runtime.SerializationSystem.Xml.Linq,现在它可以工作了! @Ninita - 刚刚注意到我没有从我的示例中删除[XmlText],这确实会导致您最初在我的代码中遇到的问题(更新)。仅使用 [XmlElement] 也可以。

以上是关于XML - 将属性反序列化为 Xml 子树的主要内容,如果未能解决你的问题,请参考以下文章

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

如何将 xml 元素值反序列化为 C# 类属性

使用 XmlSerializer 将 XML 反序列化为类型

XML 反序列化:在单个属性上使用 XmlAttribute 和 XmlText

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的

将 Xml 反序列化为对象时出错 - xmlns='' 不是预期的