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
接口提供了两个属性: LineNumber
和LinePosition
(这是我们关心的事情),还有一个方法: 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
,当您从文档中读取时,将使用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
(好运找到文档!),它inheritance自System.Xml.XmlReader
,但不是inheritance自System.Xml.XmlValidatingReader
或System.Xml.XmlTextReader
。 因此,使用如上所述的方法可能是明智之举。