2009-03-07 5 views

Répondre

35

Profitez de l'interface IXmlLineInfo pris en charge par un XmlReader:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader; 
int lineNumber = xmlInfo.LineNumber; 
+2

Cela ressemble à une mauvaise pratique. Comme XmlReader n'hérite pas IXmlLineInfo, les implémentations de cette classe abstraite ne peuvent pas implémenter l'interface. Une vérification du support de l'interface est nécessaire. – SerG

+1

Veuillez utiliser IXmlLineInfo xmlInfo = reader comme IXmlLineInfo; Ce bon code pratique. @shuvra – Shuvra

1

L'expansion de l'interface IXmlLineInfo, la documentation de c'est assez mauvaise; de faire un peu de creuser, je peux vous dire ce qui suit:

1) System.Xml.XmlReader est abstrait, donc vous n'allez jamais avoir affaire à une instance de ce, en tant que tel, le fait qu'il ne met pas en œuvre IXmlLineInfo est pas massivement en ce qui concerne (bien que, si elle le faisait, il serait tout simplement faire un peu plus facile :))

2) L'interface System.Xml.IXmlLineInfo fournit deux propriétés: LineNumber et LinePosition (qui sont les choses qui nous intéressent) , plus une méthode: HasLineInfo() qui, selon la documentation, vous permettra de savoir si un implémenteur peut retourner le lineinfo.

3) Parmi les héritiers documentés de System.Xml.XmlReader, nous avons:

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. 

En regardant la liste ci-dessus, la XmlDictionaryReader va être utilisé en interne, le XmlNodeReader va être utilisé lorsque vous avez passé dans un noeud à lire (qui, après avoir été analysé, est déjà détaché de son document source), les XmlTextReader et XmlValidtingReader (tous deux implémentant IXmlLineInfo), seront utilisés lorsque vous lisez un document. Donc, le plus long et le plus court semble être que s'il est possible ou utile de vous donner des informations de position, le cadre le fera.

Cela étant dit, la documentation semble être très légère. Ayant tout juste fait cela, je fini par faire (avec _xr étant une mise en œuvre concrète inconnue de 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() + ")"; 
    } 

Avec tout cela étant dit, quand je lance en fait le code ci-dessus, le type de _xr finit par être System.Xml.XsdValidatingReader (bonne chance de trouver de la documentation à ce sujet!), Qui hérite de System.Xml.XmlReader, mais n'hérite pas de System.Xml.XmlValidatingReader ou System.Xml.XmlTextReader. En tant que tel, il est probablement sage d'utiliser une approche comme celle ci-dessus.

Questions connexes