我正在将C#对象反序列化为一个自定义的不灵活的XML模式,以遍历和迁移数据。
一个简短的例子:
<Source>
...
<Provider>
<![CDATA[read 1]]>
<Identifier><![CDATA[read 2]]></Identifier>
<IdentificationScheme><![CDATA[read 3]]></IdentificationScheme>
</Provider>
...
</Source>
我正在寻找使用第一个CDATA元素值read 1
反序列化Provider元素,以及它的兄弟元素值read 2
和read 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上不起作用/实现,但需要进一步测试以确定。
答案 0 :(得分:1)
CDATA基本上只是逃避语法,并由大多数读者处理。你在寻找的是:
[XmlText]
public string WhateverThisIs { get; set; }
在具有原始内容的对象上。通过将其添加到Provider
,WhateverThisIs
获得"read 1"
的值。其他2个属性已正确反序列化为"read 2"
和"read 3"
,无需您执行任何操作。
作为参考,这里的所有内容在没有CDATA的情况下几乎相同(存在一些空白问题):
<Provider>
read 1
<Identifier>read 2</Identifier>
<IdentificationScheme>read 3</IdentificationScheme>
</Provider>