Número de línea actual de un System.Xml.XmlReader(C#&.Net)
line-numbers (2)
Al expandirse en la interfaz IXmlLineInfo
, la documentación para esto es bastante mala; De hacer un poco de excavación, te puedo decir lo siguiente:
1) System.Xml.XmlReader
es abstracto, por lo que nunca vas a estar tratando con una instancia de esto, como tal, el hecho de que no implementa IXmlLineInfo
no es masivamente preocupante (aunque, si lo hizo, Haría todo 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, según la documentación, le informará 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.
Mirando la lista anterior, el XmlDictionaryReader
se usará internamente, el XmlNodeReader
se usará cuando haya pasado un nodo para ser leído (el cual, una vez analizado, ya se ha desatado de su documento original), el XmlTextReader
y XmlValidtingReader
(ambos implementan IXmlLineInfo
) cuando lea un documento. Por lo tanto, lo más largo y más corto parece ser que si es posible o útil darle información sobre la posición, el marco lo hará.
Dicho esto, la documentación parece ser muy ligera. Habiendo hecho esto, terminé haciendo (con _xr una implementación concreta desconocida 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 lo que se dice, cuando ejecuto el código anterior, el tipo de _xr termina siendo System.Xml.XsdValidatingReader
(¡buena suerte encontrando documentación sobre eso!), Que se hereda de System.Xml.XmlReader
, pero no heredar de System.Xml.XmlValidatingReader
o System.Xml.XmlTextReader
. Como tal, es probable que sea prudente utilizar un enfoque como el anterior.
¿Alguien sabe cómo puedo obtener el número de línea actual de un System.Xml.XmlReader? Estoy intentando registrar dónde en un archivo encuentro elementos Xml.
Aproveche la interfaz IXmlLineInfo
soportada por un XmlReader
:
IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;