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 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 的回答中所指出的,但它没有 work/is 在 RestSharp 的 XmlDeserializer 上实现,但需要进一步测试以确定对于当然。
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>
我正在将自定义不灵活的 XML 模式反序列化为 C# 对象,以在其中遍历和迁移数据。
一个简单的例子:
<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 的回答中所指出的,但它没有 work/is 在 RestSharp 的 XmlDeserializer 上实现,但需要进一步测试以确定对于当然。
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>