Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top