Кто-нибудь знает, как я могу получить текущий номер строки System.Xml.XmlReader? Я пытаюсь записать, где в файле я нахожу элементы Xml.
Номер текущей строки из System.Xml.XmlReader(С# и .Net)
Ответ 1
Воспользуйтесь IXmlLineInfo
, поддерживаемым XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
Ответ 2
Расширяясь в интерфейсе IXmlLineInfo
, документация для этого довольно плохая; от выполнения копания, я могу сказать вам следующее:
1) System.Xml.XmlReader
является абстрактным, поэтому вы никогда не будете иметь дело с экземпляром этого, так как тот факт, что он не реализует IXmlLineInfo
, не имеет массового отношения (хотя, если он сделал бы, это сделало бы все просто немного легче:))
2) Интерфейс System.Xml.IXmlLineInfo
предоставляет два свойства: LineNumber
и LinePosition
(это то, о чем мы заботимся) плюс метод: HasLineInfo()
, который, согласно документации, сообщит вам, если разработчик может вернуть строкуinfo.
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
будет использоваться, когда вы передали в node для чтения (который, будучи разобранным, является уже отвязанный от исходного документа), 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
. Таким образом, вероятно, разумно использовать такой подход, как выше.