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

时间:2010-02-16 16:57:18

标签: c# .net cdata ixmlserializable readxml

我正试图找出一种解析xml标记的方法,其中传入内容的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();
        }                         
    }

1 个答案:

答案 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;
}