2009-03-07 17 views

Respuesta

35

Toma de la interfaz IXmlLineInfo apoyado por una XmlReader:

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

Parece una mala práctica. Como XmlReader no hereda IXmlLineInfo, las implementaciones de esta clase abstracta pueden no implementar la interfaz. Se necesita un control de soporte de la interfaz. – SerG

+1

Utilice IXmlLineInfo xmlInfo = reader como IXmlLineInfo; Esta buena práctica de código. @shuvra – Shuvra

1

Ampliando la interfaz IXmlLineInfo, la documentación de esto es bastante malo; de hacer un poco de excavación, puedo decirle lo siguiente:

1) System.Xml.XmlReader es abstracto, por lo que nunca va a tratar con una instancia de esto, como tal, el hecho de que no implementa IXmlLineInfo no está masivamente relativos a (aunque, si lo hiciera, sería hacer todo sólo un poco más fácil :))

2) La interfaz System.Xml.IXmlLineInfo proporciona dos propiedades: LineNumber y LinePosition (que son las cosas que nos interesan) , más un método: HasLineInfo() que, de acuerdo con la documentación, le permitirá saber si un implementador puede devolver el lineinfo.

3) De los herederos documentados de System.Xml.XmlReader, tenemos:

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. 

cuanto a la lista anterior, el XmlDictionaryReader va a ser utilizado internamente, la XmlNodeReader va a ser utilizado cuando haya pasado en un nodo que se leerá (que, una vez analizado, ya no está protegido de su documento de origen), se usarán XmlTextReader y XmlValidtingReader (ambos implementados IXmlLineInfo) cuando está leyendo un documento. Por lo tanto, parece que si es posible o útil darle información de posición, el marco lo hará.

Dicho esto, la documentación parece ser muy ligera. Habiendo hecho esto, terminé haciendo (con _xr ser una aplicación concreta desconocido 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() + ")"; 
    } 

Con todo esto dicho, cuando realmente ejecutar el código anterior, el tipo de _xr termina siendo System.Xml.XsdValidatingReader (¡buena suerte encontrar documentación sobre eso!), Que hereda de System.Xml.XmlReader, pero no hereda de System.Xml.XmlValidatingReader o System.Xml.XmlTextReader. Como tal, probablemente sea prudente usar un enfoque como el anterior.

Cuestiones relacionadas