Подтвердить что ты не робот

Номер текущей строки из System.Xml.XmlReader(С# и .Net)

Кто-нибудь знает, как я могу получить текущий номер строки System.Xml.XmlReader? Я пытаюсь записать, где в файле я нахожу элементы Xml.

4b9b3361

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