Расширяя интерфейс 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
. Поэтому, вероятно, целесообразно использовать подход, подобный приведенному выше.