实现IXmlSerializable为包含数据的内容包含或不包含CDATA标记
我想弄清楚一种方法来解析xml标记,其中内容传入与CDATA标记为一些输入,但不是所有。实现IXmlSerializable为包含数据的内容包含或不包含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();
}
}
下面的代码是在下列样品进行测试:
<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;
}
这确实有用。我最终使用Xnode而不是XmlDocument,然后使用其createNavigator方法来获取XPathNavigator以用于检索innerxml。 – jvtech 2010-02-16 21:20:26
使用XmlNode可能会更好,并且很高兴它可以工作。随意标记接受的答案:) – 2010-02-16 21:30:46
使用XmlDocument.Load,然后让XmlNode不适合我。我给出的示例中的示例xml仅仅是实际输入数据中的一个节点(实际输入具有相当复杂的xml结构)。所以,如果我在解析这个特定的节点时试图做XmlDocument.Load,那么我得到错误,并且无法进一步阅读。 – jvtech 2010-02-16 21:41:29
您能提供一个失败代码的例子吗?如果我将 nocdata传递给您的ReadXml函数,它工作得很好。 – 2010-02-16 18:43:57
当我的标签没有cdata surrouding标签时,它对我来说是失败的。当你从上面的样本中删除CDATA标签后,确定它适用于你?执行reader.ReadEndElement()时出现错误... – jvtech 2010-02-16 19:03:52
我测试了一个更简单的问题。检查我的答案代码示例。 – 2010-02-16 20:27:40