Текущий номер строки из System.Xml.XmlReader (C # & .Net)
-
05-07-2019 - |
Вопрос
Кто-нибудь знает, как я могу получить текущий номер строки 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 ()
, который, согласно документации, сообщит вам, может ли разработчик вернуть информацию о строке.
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
. Поэтому, вероятно, целесообразно использовать подход, подобный приведенному выше.