有谁知道如何获取 System.Xml.XmlReader 的当前行号?我正在尝试记录在文件中找到 Xml 元素的位置。
2 回答
利用IXmlLineInfo
由 an 支持的接口XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
扩展IXmlLineInfo
界面,这方面的文档非常糟糕;通过一些挖掘,我可以告诉你以下内容:
1)System.Xml.XmlReader
是抽象的,所以你永远不会处理这个的实例,因此,它没有实现的事实并没有引起很大IXmlLineInfo
的关注(尽管,如果它实现了,它会让一切变得那么小容易一点:))
2)System.Xml.IXmlLineInfo
接口提供了两个属性:LineNumber
和LinePosition
(这是我们关心的东西),加上一个方法:HasLineInfo()
根据文档,它将让您知道实现者是否可以返回 lineinfo。
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
and 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
or System.Xml.XmlTextReader
。因此,使用上述方法可能是明智的。