序列化/反序列化包含CDATA属性的XML出现问题

3
我需要对以下xml文件进行反序列化/序列化处理:
<items att1="val">
<item att1="image1.jpg">
         <![CDATA[<strong>Image 1</strong>]]>
</item>
<item att1="image2.jpg">
         <![CDATA[<strong>Image 2</strong>]]>
</item>     
</items>

我的C#类:

[Serializable]
[XmlRoot("items")]    
public class RootClass
{
  [XmlAttribute("att1")]
  public string Att1 {set; get;}

  [XmlElement("item")]  
  public Item[] ArrayOfItem {get; set;}
}

  [Serializable]
public class Item
{
    [XmlAttribute("att1")]
    public string Att1 { get; set; }

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

一切都几乎完美地运行,但是在反序列化之后出现了问题

<![CDATA[<strong>Image 1</strong>]]>

我会

&lt;strong&gt;Image 1&lt;/strong&gt;

我试图将XmlCDataSection作为Content属性的类型,但是这种类型与XmlText属性不允许一起使用。不幸的是,我无法更改XML结构。

我该如何解决这个问题?


1
<![CDATA[<strong>Image 1</strong>]]>&lt;strong&gt;Image 1&lt;/strong&gt; 是同一件事情。你的问题在哪里? - Tomalak
另一个读取xml的应用程序在“<strong>Image 1</strong>”方面存在一些问题。 - higi
这意味着另一个应用程序无法理解XML,需要进行修复。 - Tomalak
@Tomalak,就像你所说的一样,因为两个版本是相同的,所以这不是我的错;)另一个应用程序无法工作。我已向该应用程序的所有者报告了问题,并正在等待一些热修复。谢谢! - higi
3个回答

1

这应该会有所帮助

    private string content;

    [XmlText]
    public string Content
    {
        get { return content; }
        set { content = XElement.Parse(value).Value; }
    }

1

首先将一个属性声明为XmlCDataSection

public XmlCDataSection ProjectXml { get; set; }

在这种情况下,projectXml是一个字符串XML。
ProjectXml = new XmlDocument().CreateCDataSection(projectXml);

当你序列化你的消息时,你会得到一个漂亮的格式(注意)

<?xml version="1.0" encoding="utf-16"?>
<MessageBase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="Message_ProjectStatusChanged">
  <ID>131</ID>
  <HandlerName>Plugin</HandlerName>
  <NumRetries>0</NumRetries>
  <TriggerXml><![CDATA[<?xml version="1.0" encoding="utf-8"?><TmData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="9.0.0" Date="2012-01-31T15:46:02.6003105" Format="1" AppVersion="10.2.0" Culture="en-US" UserID="0" UserRole=""><PROJECT></PROJECT></TmData>]]></TriggerXml>
  <MessageCreatedDate>2012-01-31T20:28:52.4843092Z</MessageCreatedDate>
  <MessageStatus>0</MessageStatus>
  <ProjectId>0</ProjectId>
  <UserGUID>8CDF581E44F54E8BAD60A4FAA8418070</UserGUID>
  <ProjectGUID>5E82456F42DC46DEBA07F114F647E969</ProjectGUID>
  <PriorStatus>0</PriorStatus>
  <NewStatus>3</NewStatus>
  <ActionDate>0001-01-01T00:00:00</ActionDate>
</MessageBase>

0

StackOverflow上提供的大多数解决方案仅适用于序列化,而不是反序列化。这个解决方案将完成任务,如果您需要从代码中获取/设置值,请使用我添加的额外属性PriceUrlByString。

    private XmlNode _priceUrl;
    [XmlElement("price_url")]
    public XmlNode PriceUrl
    {
        get
        {
            return _priceUrl;
        }
        set
        {
            _priceUrl = value;
        }
    }

    [XmlIgnore]
    public string PriceUrlByString
    {
        get
        {
            // Retrieves the content of the encapsulated CDATA
            return _priceUrl.Value;
        }

        set
        {
            // Encapsulate in a CDATA XmlNode
            XmlDocument xmlDocument = new XmlDocument();
            this._priceUrl = xmlDocument.CreateCDataSection(value);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接