and*_*ndy 8 .net c# xml xmlreader xml-parsing
嘿伙计们,我有这个场景:
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName)
{
XElement item = null;
try
{
item = XElement.ReadFrom(reader) as XElement;
}
catch (XmlException ex)
{
//log line number and stuff from XmlException class
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的循环中,我将某个节点(itemElementName)转换为XElement.
一些节点将是良好的XML并将进入XElement,但有些节点不会.
在CATCH中,我不仅要捕获标准的XmlException内容......我还想捕获当前Xml和字符串的提取.
但是,如果我在将节点传递给XElement之前对节点执行任何类型的READ操作,它会向前移动读取器.
如何在不干扰其位置的情况下获取阅读器外部内容的"快照"?
Vit*_*SFT 10
实际上,ReadSubtree将返回一个"包装"原始阅读器的阅读器.因此,通过新的阅读将最终推进原始的.您必须将XmlReader视为仅向前阅读器,它根本无法返回.至于您的场景,您可以向读者询问输入文件中的位置,而不是尝试记住部分XML.只需将其强制转换为IXmlLineInfo接口,它就有返回行和位置的方法.使用它你可以记住一些起始位置(在有问题的元素之前),然后记住错误的结束位置.然后从intput文件中读取该部分作为纯文本.
小智 5
另一个想法:读取外部 XML(使阅读器前进),然后从这个 XML 创建一个新的阅读器,它允许您“返回”并处理当前节点的元素。
while (r.ReadToFollowing("ParentNode"))
{
parentXml = r.ReadOuterXml();
//since ReadOuterXml() advances the reader to the next parent node, create a new reader to read the remaining elements of the current parent
XmlReader r2 = XmlReader.Create(new StringReader(parentXml));
r2.ReadToFollowing("ChildNode");
childValue = r2.ReadElementContentAsString();
r2.Close();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11675 次 |
最近记录: |