Clase System.Xml.XmlTextReader
En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.
Nota:
Se recomienda crear instancias XmlReader mediante el método XmlReader.Create para aprovechar las nuevas funcionalidades.
XmlTextReader proporciona acceso de solo avance y de solo lectura a un flujo de datos XML. El nodo actual hace referencia al nodo en el que está situado el sistema de lectura. Para avanzar el sistema de lectura, utilice cualquiera de los métodos de lectura y las propiedades reflejan el valor del nodo actual.
Esta clase implementa XmlReader y cumple con el Lenguaje de marcado extensible (XML) 1.0 de W3C y los espacios de nombres en recomendaciones XML. XmlTextReader
proporciona la siguiente funcionalidad:
Aplica las reglas de XML con formato correcto.
XmlTextReader
no proporciona validación de datos.Comprueba que
DocumentType
los nodos tienen el formato correcto.XmlTextReader
comprueba la DTD para ver que tenga un formato correcto, pero no valida el uso de DTD.Para los nodos donde NodeType es
XmlNodeType.EntityReference
, se devuelve un único nodo vacíoEntityReference
(es decir, la propiedad Value esString.Empty
).
Nota:
Las declaraciones reales de entidades de la DTD se denominan nodos Entity
. Al hacer referencia a estos nodos en los datos, se les llama nodos EntityReference
.
- No expande los atributos predeterminados.
Dado que XmlTextReader
no realiza las comprobaciones adicionales necesarias para la validación de datos, proporciona un analizador bien formado rápido.
Para realizar la validación de datos, use una validación de XmlReader.
Para leer datos XML de un XmlDocument, use XmlNodeReader.
XmlTextReader
genera un XmlException en los errores de análisis XML. Después de iniciar una excepción, el estado del lector no es predecible. Por ejemplo, el tipo de nodo notificado puede ser diferente del tipo de nodo real del nodo actual. Use la propiedad ReadState para comprobar si el lector está en estado de error.
Consideraciones sobre la seguridad
A continuación, se muestran aspectos que se deben tener en cuenta al usar la clase XmlTextReader.
Las excepciones producidas por el XmlTextReader pueden revelar información de ruta de acceso que no desea que se propague a la aplicación. Las aplicaciones deben detectar las excepciones y procesarlas de la manera correspondiente.
El procesamiento de DTD está habilitado de manera predeterminada. Deshabilite el procesamiento de DTD si le preocupan los problemas de denegación de servicio o si trabaja con orígenes que no son de confianza. Para deshabilitarlo, establezca la propiedad DtdProcessing en Prohibit.
Si tiene habilitado el procesamiento de DTD, puede utilizar XmlSecureResolver para restringir los recursos a los que tiene acceso XmlTextReader. También puede diseñar su aplicación para que el procesamiento XML se realice con restricciones de memoria y tiempo. Por ejemplo, puede configurar límites de tiempo de espera en la aplicación ASP.NET.
Los datos XML pueden incluir referencias a recursos externos como, por ejemplo, un archivo DTD. De manera predeterminada, los recursos externos se resuelven utilizando un objeto XmlUrlResolver sin credenciales de usuario. Puede aumentar la protección aún más realizando cualquiera de las siguientes acciones:
Restrinja los recursos a los que puede tener acceso XmlTextReader estableciendo la propiedad XmlResolver en un objeto XmlSecureResolver.
No permita que XmlReader abra ningún recurso externo estableciendo la propiedad XmlResolver en
null
.
Los datos XML pueden contener un gran número de atributos, declaraciones de espacios de nombres, elementos anidados, etc. cuyo procesamiento tarda una cantidad de tiempo importante. Para limitar el tamaño de la entrada que se envía a XmlTextReader, cree una implementación de IStream personalizada y proporcione el XmlTextReader.
El método ReadValueChunk se puede usar para controlar grandes flujos de datos. Este método lee una pequeña cantidad de caracteres a la vez en lugar de asignar una única cadena para todo el valor.
De manera predeterminada, las entidades generales no se expanden. Lo hacen cuando se llama al método ResolveEntity.