有谁知道如何获取 System.Xml.XmlReader 的当前行号?我正在尝试记录在文件中找到 Xml 元素的位置。
利用 IXmlLineInfo
支持的
XmlReader
界面:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
在
IXmlLineInfo
界面上进行扩展,这方面的文档非常糟糕;经过一番挖掘,我可以告诉你以下内容:
1)
System.Xml.XmlReader
是抽象的,所以你永远不会处理这样的实例,因此,它没有实现 IXmlLineInfo
的事实并不令人担忧(尽管,如果实现了,这会让一切变得更容易:) )
2)
System.Xml.IXmlLineInfo
接口提供了两个属性:LineNumber
和LinePosition
(这是我们关心的事情),再加上一个方法:HasLineInfo()
,根据文档,它会让你知道实现者是否可以返回线路信息。
3) 在
System.Xml.XmlReader
的记录继承者中,我们有:
System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo.
查看上面的列表,
XmlDictionaryReader
将在内部使用,XmlNodeReader
将在您传入要读取的节点时使用(该节点已被解析,已经脱离了其源文档),XmlTextReader
和XmlValidtingReader
(两者都实现了IXmlLineInfo
),将在您阅读文档时使用。因此,总而言之,如果向您提供位置信息可能或有用,框架就会这样做。
话虽如此,文档似乎非常简单。刚刚完成此操作后,我最终做了(_xr 是
System.Xml.XmlReader
的未知具体实现):
string position = "(unknown)";
if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) &&
((System.Xml.IXmlLineInfo)_xr).HasLineInfo())
{
System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr;
position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")";
}
话虽如此,当我实际运行上面的代码时,_xr 的类型最终是
System.Xml.XsdValidatingReader
(祝你好运找到相关文档!),它继承自 System.Xml.XmlReader
,但不继承于 System.Xml.XmlValidatingReader
或 System.Xml.XmlTextReader
。因此,使用上述方法可能是明智的。
使用 IXmlLineInfo 和“现代”c# 对 Daniel 的长期答案进行了小小的改进:
int lineNumber = (reader is IXmlLineInfo xmlLine && xmlLine.HasLineInfo()) ? xmlLine.LineNumber : -1;