gpt4 book ai didi

c# - .Net XmlSerializer : deserialize CDATA being inner text

转载 作者:太空狗 更新时间:2023-10-29 21:20:57 28 4
gpt4 key购买 nike

我在使用标准 .Net XmlSerializer 进行 CDATA 反序列化时遇到问题。

更新:我从外部系统获取 XML,我无法影响它的格式,所以我无法将 CData 包含在单独的属性元素中。

序列化给出了这个:

<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><![CDATA[Hello, world!]]></MyClass>

反序列化不会将对象恢复到其原始状态。

这是被序列化的类:

public class MyClass
{
string _data;

[XmlIgnore]
public string Data
{
get { return _data; }
set { _data = value; }
}

[XmlAnyElement]
public XmlCDataSection CData
{
get { return new XmlDataDocument().CreateCDataSection(Data); }
set { Data = value.Value; }
}
}

这是失败的测试:

[Test]
public void CData_as_inner_text_test()
{
MyClass item = new MyClass();

item.Data = "Hello, world!";

XmlSerializer serializer = new XmlSerializer(item.GetType());
string serialized;

using (StringWriter sw = new StringWriter())
{
serializer.Serialize(sw, item);
serialized = sw.GetStringBuilder().ToString();
}

MyClass deserialized;

using (StringReader sr = new StringReader(serialized))
{
deserialized = (MyClass)serializer.Deserialize(sr);
}

Assert.AreEqual(item.Data, deserialized.Data); // For some reason, deserialized.Data == null
}

我在这里发现了同样的问题,但没有答案: XmlSerializer, XmlAnyElement and CDATA

最佳答案

CData 属性以 null 结尾,因为 CDATA 部分的内容以 Data 属性结尾,它被忽略了......

<MyClass><![CDATA[Hello, world!]]></MyClass>

绝对等同于:

<MyClass>Hello, world!</MyClass>

您不应该关心外部应用程序是否将 MyClass 的内容写入 CData。同样,外部应用程序不应该关心你是如何写出来的。

IOW,这应该是您所需要的:

public class MyClass
{
string _data;

[XmlText]
public string Data
{
get { return _data; }
set { _data = value; }
}
}

关于c# - .Net XmlSerializer : deserialize CDATA being inner text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/397085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com