XmlDeserialize cdata 及其兄弟

XmlDeserialize cdata and its siblings

我正在将自定义不灵活的 XML 模式反序列化为 C# 对象,以在其中遍历和迁移数据。

一个简单的例子:

  <Source>
    ...
    <Provider>
      <![CDATA[read 1]]>
      <Identifier><![CDATA[read 2]]></Identifier>
      <IdentificationScheme><![CDATA[read 3]]></IdentificationScheme>
    </Provider>
    ...
  </Source>

我正在寻找反序列化具有第一个 CDATA 元素值 read 1 的 Provider 元素,它也是兄弟元素值,read 2read 3

使用 http://xmltocsharp.azurewebsites.net/ 它产生以下对象:

[XmlRoot(ElementName = "Provider")]
public class Provider
{
    [XmlElement(ElementName = "Identifier")]
    public string Identifier { get; set; }
    [XmlElement(ElementName = "IdentificationScheme")]
    public string IdentificationScheme { get; set; }
}

[XmlRoot(ElementName = "Source")]
public class Source
{
    [XmlElement(ElementName = "Provider")]
    public Provider Provider { get; set; }
}

但它没有考虑 CDATA 值,事实上我认为像这样反序列化它的值将无法达到。

我认为这可能也与要使用的 XmlDeserializer 有关,我正计划使用 RestSpharp(因为它已经是网站的库)或 System.Xml.Link.XDocument,但我不确定是否可以处理这种情况?

在我的搜索中我也找不到示例,但堆栈确实建议这个 <!{CDATA[]]> and <ELEMENT> in a xml element 这与模式选项完全相同。

非常感谢您的提前帮助,

编辑 1 据我所知,[XmlText] 是所需的解决方案,正如下面 Marc Gravell 的回答中所指出的,但它没有 work/is 在 RestSharp 的 XmlDeserializer 上实现,但需要进一步测试以确定对于当然。

CDATA 本质上只是转义语法,大多数读者都可以使用。您正在寻找的是:

[XmlText]
public string WhateverThisIs { get; set; }

在具有原始内容的对象上。通过将其添加到 ProviderWhateverThisIs 获得 "read 1" 的值。其他 2 个属性已经正确反序列化为 "read 2""read 3",您无需执行任何操作。

作为参考,这里的所有内容在没有 CDATA 的情况下 几乎 都一样(存在一些空白问题):

<Provider>
  read 1
  <Identifier>read 2</Identifier>
  <IdentificationScheme>read 3</IdentificationScheme>
</Provider>