Pregunta

¿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.

¿Fue útil?

Solución

Aproveche la IXmlLineInfo interfaz soportada por un XmlReader :

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

Otros consejos

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 tener una instancia de esto, como tal, el hecho de que no implementa IXmlLineInfo no es muy preocupante (aunque, si lo hiciera, haría que todo fuera un poco más sencillo :))

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 la información de línea.

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, XmlDictionaryReader se usará internamente, XmlNodeReader se usará cuando hayas pasado un nodo para leer (que, una vez analizado, ya se ha desatado de su documento de origen), el XmlTextReader y XmlValidtingReader (ambos implementan IXmlLineInfo ), son Se va a utilizar cuando estás leyendo un documento. Por lo tanto, lo más largo y más corto parece ser que si es posible o útil proporcionarle información sobre la posición, el marco lo hará.

Dicho esto, la documentación parece ser muy ligera. Después de hacer 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() + ")";
    }

Habiendo dicho todo eso, cuando ejecuté el código anterior, el tipo de _xr termina siendo System.Xml.XsdValidatingReader (¡buena suerte encontrando 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 aconsejable utilizar un enfoque como el anterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top