实现IXmlSerializable为包含数据的内容包含或不包含CDATA标记

问题描述:

我想弄清楚一种方法来解析xml标记,其中内容传入与CDATA标记为一些输入,但不是所有。实现IXmlSerializable为包含数据的内容包含或不包含CDATA标记

例如,以下是我将收到的包含CDATA标签的数据的示例内容。但是还有一些CDATA标签被忽略的场景。

<Data><![CDATA[ <h1>CHAPTER 2<br/> EDUCATION</h1> 
       <P> Analysis paragraph </P> ]]></Data> 

有没有一种优雅的方式来检测,并实现可以解析这两种类型的输入(有或没有CDATA)的ReadXml方法?到目前为止,我的ReadXml()实现如下,但是当省略CDATA标记时会解析错误。

public void ReadXml(XmlReader reader) 
    { 
     bool isEmpty = reader.IsEmptyElement; 
     reader.ReadStartElement(); 
     if (isEmpty) 
     { 
      _data = string.Empty; 
     } 
     else 
     {     
      switch (reader.MoveToContent()) 
      { 
       case XmlNodeType.Text: 
       case XmlNodeType.CDATA: 
        _data = reader.ReadContentAsString(); 
        break; 
       default: 
        _data = string.Empty; 
        break; 
      } 
      reader.ReadEndElement(); 
     }       
    } 
+0

您能提供一个失败代码的例子吗?如果我将 nocdata传递给您的ReadXml函数,它工作得很好。 – 2010-02-16 18:43:57

+0

当我的标签没有cdata surrouding标签时,它对我来说是失败的。当你从上面的样本中删除CDATA标签后,确定它适用于你?执行reader.ReadEndElement()时出现错误... – jvtech 2010-02-16 19:03:52

+0

我测试了一个更简单的问题。检查我的答案代码示例。 – 2010-02-16 20:27:40

下面的代码是在下列样品进行测试:

<Data><h1>CHAPTER 2<br/> EDUCATION</h1><P> Analysis paragraph </P></Data> 
<Data>test<h1>CHAPTER 2<br/> EDUCATION</h1><P> Analysis paragraph </P></Data> 
<Data><![CDATA[ <h1>CHAPTER 2<br/> EDUCATION</h1><P> Analysis paragraph </P> ]]></Data> 
<Data></Data> 

我使用的XPathNavigator代替,因为它允许回溯。

public void ReadXml(XmlReader reader) 
{ 
    XmlDocument doc = new XmlDocument {PreserveWhitespace = false}; 
    doc.Load(reader); 

    var navigator = doc.CreateNavigator(); 
    navigator.MoveToChild(XPathNodeType.Element); 
    _data = navigator.InnerXml.Trim().StartsWith("&lt;") ? navigator.Value : navigator.InnerXml; 
} 
+0

这确实有用。我最终使用Xnode而不是XmlDocument,然后使用其createNavigator方法来获取XPathNavigator以用于检索innerxml。 – jvtech 2010-02-16 21:20:26

+0

使用XmlNode可能会更好,并且很高兴它可以工作。随意标记接受的答案:) – 2010-02-16 21:30:46

+0

使用XmlDocument.Load,然后让XmlNode不适合我。我给出的示例中的示例xml仅仅是实际输入数据中的一个节点(实际输入具有相当复杂的xml结构)。所以,如果我在解析这个特定的节点时试图做XmlDocument.Load,那么我得到错误,并且无法进一步阅读。 – jvtech 2010-02-16 21:41:29