有人知道如何获取System.Xml.XmlReader的当前行号吗?我试图记录在文件中找到Xml元素的位置。
有人知道如何获取System.Xml.XmlReader的当前行号吗?我试图记录在文件中找到Xml元素的位置。
利用由XmlReader
支持的IXmlLineInfo
接口:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
IXmlLineInfo
接口的文档非常糟糕。通过一些调查,我可以告诉你以下内容:System.Xml.XmlReader
是抽象的,因此您永远不会处理这个实例,因此它没有实现IXmlLineInfo
并不是非常令人担心(尽管如果它实现了,一切都会变得更加容易 :))System.Xml.IXmlLineInfo
接口提供两个属性:LineNumber
和LinePosition
(这是我们关心的内容),以及一个方法:HasLineInfo()
,根据文档,它可以让您知道实现者是否能够返回行信息。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
)。 因此,长话短说,如果可能或有用提供位置信息,则框架会这样做。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
。因此,像上面那样使用一个方法可能是明智的。
XmlNodeReader
没有继承IXmlLineInfo
。 - Josef Trejbal