有谁知道如何获取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 继承。因此,使用如上所述的方法可能是明智的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top