XmlDeserialize cdata及其兄弟姐妹

时间:2018-04-07 16:25:57

标签: c# traversal cdata xml-deserialization

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

一个简短的例子:

  <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在下面给出的答案所指出的那样,但它在RestSharp的XmlDeserializer上不起作用/实现,但需要进一步测试以确定。

1 个答案:

答案 0 :(得分:1)

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>