2010-02-16 7 views
0

Я пытаюсь выяснить способ анализа XML-тега, в котором содержимое передается с тегами CDATA для некоторого ввода, но не для всех.Реализация IXmlSerializable для содержимого, содержащего данные с или без тегов CDATA

Например, приведен пример содержимого, который я получал бы для данных, содержащих теги CDATA. Но есть и другие сценарии, где теги CDATA ограничены.

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

Есть элегантный способ как-то определить, что и реализовать метод ReadXml, который может анализировать оба типа ввода (с или без CDATA)? Пока моя реализация 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, она работает нормально. –

+0

Его недостаток для меня, когда тег не имеет привязанных к cdata тегов. Конечно, это сработало для вас после того, как вы удалили тег CDATA из образца, который у меня выше? Я получаю сообщение об ошибке при выполнении чтения.ReadEndElement() ... – jvtech

+0

Я тестировал на более простой. Проверьте мой ответ на образец кода. –

ответ

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

+0

Использование XmlNode, вероятно, лучше, и рад, что он сработал. Не стесняйтесь отмечать ответ так же, как принято :) –

+0

Использование XmlDocument.Load, а затем получение XmlNode не работает для меня. Образец xml в примере, который я дал, является лишь одним из узлов в фактических входных данных (фактический ввод имеет довольно сложную структуру xml). Поэтому, если я пытаюсь выполнить XmlDocument.Load при разборе этого конкретного узла, я получаю ошибки и не могу читать дальше. – jvtech