2009-03-07 7 views

Antwort

35

Nutzen Sie die IXmlLineInfo Schnittstelle von einem XmlReader unterstützt:

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

Sieht aus wie schlechte Praxis. Da XmlReader IXmlLineInfo nicht erbt, implementieren Implementierungen dieser abstrakten Klasse die Schnittstelle möglicherweise nicht. Eine Überprüfung auf Unterstützung der Schnittstelle ist erforderlich. – SerG

+1

Bitte verwenden Sie IXmlLineInfo xmlInfo = reader als IXmlLineInfo; Diese gute Code-Praxis. @shuvra – Shuvra

1

Aufbauend auf der IXmlLineInfo Schnittstelle, denn dies ist die Dokumentation ziemlich schlecht ist; von ein bisschen Graben, kann ich Ihnen folgendes sagen:

1) System.Xml.XmlReader ist abstrakt, so dass Sie nie mit einer Instanz davon zu tun, als solche, die Tatsache, dass es nicht implementieren wird IXmlLineInfo nicht massiv über

2) Die System.Xml.IXmlLineInfo Schnittstelle bietet zwei Eigenschaften (obwohl, wenn es so wäre, wäre es alles nur ein bisschen einfacher :) machen): LineNumber und LinePosition (das sind die Dinge, die wir kümmern uns um) , plus eine Methode: HasLineInfo() die, nach der Dokumentation, Sie wissen lassen wird, wenn ein Implementor die Lineinfo zurückgeben kann.

3) Von den dokumentierten Erben System.Xml.XmlReader, haben wir:

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. 

in der obigen Liste der Suche, die XmlDictionaryReader intern verwendet werden soll, die XmlNodeReader verwendet werden wird, wenn Sie bestanden haben in einem zu lesenden Knoten (der, nachdem er analysiert wurde, bereits aus seinem Quelldokument entfernt ist), werden XmlTextReader und XmlValidtingReader (die beide IXmlLineInfo implementieren) verwendet, wenn Sie aus einem Dokument lesen. Also, das lange und kurze scheint, dass, wenn es möglich oder nützlich ist, Ihnen Positionsinformationen zu geben, der Rahmen dies tun wird.

Das gesagt, die Dokumentation scheint sehr leicht zu sein. Nachdem dies nur getan, ich am Ende tun (mit _xr eine unbekannte konkrete Umsetzung System.Xml.XmlReader ist):

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() + ")"; 
    } 

Mit all diesem wird gesagt, wenn ich den Code oben tatsächlich ausgeführt werden, endet die Art von _xr bis zu sein System.Xml.XsdValidatingReader (viel Glück bei der Suche nach Dokumentation!), Die von System.Xml.XmlReader erbt, aber nicht erbt von System.Xml.XmlValidatingReader oder System.Xml.XmlTextReader. Daher ist es wahrscheinlich ratsam, einen Ansatz wie den obigen zu verwenden.

Verwandte Themen