0

我试图找出一种解析 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();
        }                         
    }
4

1 回答 1

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;
}
于 2010-02-16T20:27:13.167 回答