2010-02-16 9 views
0

일부 입력에 대해서는 내용이 CDATA 태그로 전달되는 XML 태그를 구문 분석하는 방법을 알아 내려고했지만 모든 것에 대해서는 그렇지 않습니다.CDATA 태그의 유무에 관계없이 데이터가 포함 된 내용에 대해 IXmlSerializable을 구현하십시오.

예를 들어, 다음은 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

실패한 코드의 예를 제공해 주시겠습니까? ReadXml 함수에 nocdata을 전달하면 올바르게 작동합니다. –

+0

태그가 cdata surrouding tags를 가지고 있지 않을 때 저에게 실패합니다. 위의 샘플에서 CDATA 태그를 제거한 후에 확실하게 작동 했습니까? reader.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

그 트릭을 않습니다. XmlDocument 대신 Xnode를 사용하고 나서 createNavigator 메서드를 사용하여 innerxml을 검색하는 데 사용할 XPathNavigator를 얻습니다. – jvtech

+0

XmlNode를 사용하면 더 효과적 일 것입니다. 자유롭게 받아 들여진 답을 표시해주세요. –

+0

XmlDocument.Load를 사용하고 XmlNode를 얻는 것이 효과적이지 않습니다. 예제에서 제공 한 예제 xml은 실제 입력 데이터의 노드 중 하나입니다 (실제 입력은 꽤 복잡한 xml 구조를가집니다). 그래서이 특정 노드를 파싱 할 때 XmlDocument.Load를 수행하려고하면 오류가 발생하며 더 이상 읽을 수 없습니다. – jvtech