Текущий номер строки из System.Xml.XmlReader (C # & .Net) - PullRequest
24 голосов
/ 07 марта 2009

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

Ответы [ 2 ]

41 голосов
/ 07 марта 2009

Воспользуйтесь интерфейсом IXmlLineInfo, поддерживаемым XmlReader:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;
2 голосов
/ 19 июля 2017

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

...