【问题标题】:Problem with Serialization/Deserialization an XML containing CDATA attribute序列化/反序列化包含 CDATA 属性的 XML 的问题
【发布时间】:2011-03-19 19:21:47
【问题描述】:

我需要反序列化/序列化下面的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 结构。

我该如何解决这个问题?

【问题讨论】:

  • &lt;![CDATA[&lt;strong&gt;Image 1&lt;/strong&gt;]]&gt;&amp;lt;strong&amp;gt;Image 1&amp;lt;/strong&amp;gt; 是一回事。你的问题在哪里?
  • 另一个读取 xml 的应用程序的“<strong>Image 1</strong>”有一些问题
  • 这意味着这个其他应用程序无法理解 XML,应该修复。
  • @Tomalak 就像你说的那样,因为两个版本是相同的,所以这不是我的错;)另一个应用程序不起作用。我向这个应用程序的所有者报告了这个问题,我正在等待一些修补程序。谢谢!

标签: c# .net xml xml-serialization cdata


【解决方案1】:

这应该有帮助

    private string content;

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

【讨论】:

    【解决方案2】:

    首先声明一个属性为 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>
    

    【讨论】:

      【解决方案3】:

      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);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 1970-01-01
        相关资源
        最近更新 更多