System.Xml.XmlReader(C#& .Net)中的当前行号
-
05-07-2019 - |
题
有谁知道如何获取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()
,根据文档,它会告诉你实现者是否可以返回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
和 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
继承。因此,使用如上所述的方法可能是明智的。