2010-02-16 99 views
0

我想弄清楚一種方法來解析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

回答

1

下面的代碼是在下列樣品進行測試:

<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