Question

Quelqu'un sait-il comment obtenir le numéro de ligne actuel d'un System.Xml.XmlReader? J'essaie d'enregistrer où, dans un fichier, je trouve des éléments XML.

Était-ce utile?

La solution

Tirez parti de IXmlLineInfo interface prise en charge par un XmlReader :

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

Autres conseils

En développant l'interface IXmlLineInfo , la documentation à ce sujet est assez mauvaise; de creuser un peu, je peux vous dire ce qui suit:

1) System.Xml.XmlReader est abstrait, vous ne serez donc jamais confronté à une instance de celle-ci, en tant que telle, le fait qu'il n'implémente pas IXmlLineInfo n'est pas très inquiétant (bien que, si c'était le cas, cela simplifierait tout un peu plus facilement :))

2) L'interface System.Xml.IXmlLineInfo fournit deux propriétés: LineNumber et LinePosition (qui nous intéressent) plus une méthode: HasLineInfo () qui, selon la documentation, vous indiquera si un implémenteur peut renvoyer 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, le XmlDictionaryReader sera utilisé en interne, le XmlNodeReader sera utilisé lorsque vous aurez passé un noeud à lire. (qui, après avoir été analysé, est déjà séparé de son document source), XmlTextReader et XmlValidtingReader (les deux implémentant IXmlLineInfo ), sont va être utilisé lorsque vous lisez un document. En résumé, il semble bien que s’il est possible ou utile de vous donner des informations sur votre position, le cadre le fera.

Cela étant dit, la documentation semble être très légère. Ceci fait, j’ai fini par le faire (avec _xr une implémentation 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() + ")";
    }

Cela étant dit, lorsque je lance le code ci-dessus, le type de _xr finit par être System.Xml.XsdValidatingReader (bonne chance pour 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top