System.Xml.XmlReader(C#和.Net)中的当前行号

有谁知道我如何获得System.Xml.XmlReader的当前行号? 我试图在文件中记录我找到Xml元素的位置。

利用XmlReader支持的IXmlLineInfo接口:

 IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; int lineNumber = xmlInfo.LineNumber; 

扩展IXmlLineInfo接口,这方面的文档非常糟糕; 从做一点挖掘,我可以告诉你以下内容:

1) System.Xml.XmlReader是抽象的,所以你永远不会处理这个的实例,因此,它没有实现IXmlLineInfo的事实并没有大规模的关注(尽管,如果它,它,它会让一切变得更容易:))

2) System.Xml.IXmlLineInfo接口提供了两个属性: LineNumberLinePosition (这是我们关心的事情),还有一个方法: HasLineInfo() ,根据文档,它会告诉你实现者是否可以返回lineinfo。

3)在System.Xml.XmlReader已记录的inheritance者中,我们有:

 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 ,当您从文档中读取时,将使用XmlTextReaderXmlValidtingReader (两者都实现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 (好运找到文档!),它inheritance自System.Xml.XmlReader ,但不是inheritance自System.Xml.XmlValidatingReaderSystem.Xml.XmlTextReader 。 因此,使用如上所述的方法可能是明智之举。