来自 System.Xml.XmlReader(C# 和 .Net)的当前行号

问题描述 投票:0回答:3

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

c# .net xml xmlreader line-numbers
3个回答
47
投票

利用 IXmlLineInfo

 支持的 
XmlReader
 界面:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;

3
投票

IXmlLineInfo
界面上进行扩展,这方面的文档非常糟糕;经过一番挖掘,我可以告诉你以下内容:

1)

System.Xml.XmlReader
是抽象的,所以你永远不会处理这样的实例,因此,它没有实现
IXmlLineInfo
的事实并不令人担忧(尽管,如果实现了,这会让一切变得更容易:) )

2)

System.Xml.IXmlLineInfo
接口提供了两个属性:
LineNumber
LinePosition
(这是我们关心的事情),再加上一个方法:
HasLineInfo()
,根据文档,它会让你知道实现者是否可以返回线路信息。

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
。因此,使用上述方法可能是明智的。


0
投票

使用 IXmlLineInfo 和“现代”c# 对 Daniel 的长期答案进行了小小的改进:

int lineNumber = (reader is IXmlLineInfo xmlLine && xmlLine.HasLineInfo()) ? xmlLine.LineNumber : -1;
© www.soinside.com 2019 - 2024. All rights reserved.