【问题标题】:XML - Deserialize property as Xml sub-treeXML - 将属性反序列化为 Xml 子树
【发布时间】: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 中?

【问题讨论】:

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

标签: c# xml serialization xml-serialization xmlserializer


【解决方案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] 也可以。
猜你喜欢
  • 2023-04-07
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多