我正试图找出一种解析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();
}
}
答案 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("<") ? navigator.Value : navigator.InnerXml;
}