25

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

4

2 回答 2

43

利用IXmlLineInfo由 an 支持的接口XmlReader

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
于 2009-03-07T01:02:18.067 回答
3

扩展IXmlLineInfo界面,这方​​面的文档非常糟糕;通过一些挖掘,我可以告诉你以下内容:

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

2)System.Xml.IXmlLineInfo接口提供了两个属性:LineNumberLinePosition(这是我们关心的东西),加上一个方法: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将在您传入要读取的节点时使用(已被解析,已与源文档无关),XmlTextReaderand 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.XmlValidatingReaderor System.Xml.XmlTextReader。因此,使用上述方法可能是明智的。

于 2017-07-19T06:06:46.547 回答