2011-07-11 21 views
9

Estoy tratando de usar el XmlReader de C# en una gran serie de archivos XML, todos tienen el formato correcto excepto unos pocos (lamentablemente no estoy en posición de cambiarlos) , porque rompería muchos otros códigos).usando el XmlReader de C# en XML ligeramente deformado

Los errores solo provienen de una parte específica de estos archivos XML en desacuerdo y está bien omitirlos pero no quiero dejar de leer el resto del archivo XML.

Las partes malas aspecto:

<InterestingStuff> 
    ... 
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/> 
    <OtherInterestingStuff> 
    ... 
    </OtherInterestingStuff> 
</InterestingStuff> 

Así que en realidad si tan sólo pudiera ignorar las etiquetas no válidas, o ignorar el símbolo de canalización entonces estaría bien.

Intentar usar XmlReader.Skip() cuando veo que el nombre "ErrorsHere" no funciona, aparentemente ya se lee un poco adelante y arroja la excepción.

TLDR: ¿Cómo puedo omitir para poder leer en el archivo XML anterior, utilizando el XmlReader?

Editar:

algunas personas sugirieron sólo la sustitución de la '|' -Símbolo, pero la idea de XmlReader es no cargar todo el archivo, pero sólo algunas partes de la poligonal que desee, ya que estoy leyendo directamente de los archivos que no puede pagar la lectura en archivos completos, reemplace todas las instancias de '|' y luego lee partes de nuevo :).

+0

reemplazando | firmar antes de cargar un lector con - podría resolver el problema –

+0

¿Cómo está leyendo la información en XmlReader? ¿Estás leyendo de la corriente? – Jethro

+3

si conoce el error por adelantado, ¿no puede parchear el contenido de la fuente antes de analizarlo? Pero de una manera general, debe corregir el código fuente xml .... o no lo llame XML (me imagino que usted es dependiente de otra persona ...?) –

Respuesta

4

He experimentado un poco con esto en el pasado.

En general, la entrada simplemente tiene que estar bien formada. Un XmlReader entrará en un estado de error irrecuperable cuando se rompan las reglas XML básicas. Es fácil evitar la validación de esquema, pero eso no es relevante aquí.

Su única opción es limpiar la entrada, que se puede hacer de forma continua (Stream o TextReader personalizado), pero eso requerirá una ligera forma de análisis. Si no tiene símbolos de tubería en posiciones válidas, es fácil.

+0

Hola Henk, esta me parece la mejor solución. También intenté simplemente cargar todo el archivo y reemplazar las tuberías, pero esto hizo que el análisis tomara el doble de tiempo (aunque utilicé una secuencia de memoria para almacenar los datos cargados). La extensión de un flujo o un TextReader parece una buena idea para seguir desempeñándote. –

1

XmlReader es estricto. Cualquier no conformidad, será un error.

Así que no, no puede hacer eso a menos que escriba su propia implementación xml. La corrección en los datos mal formados es probablemente más fácil.

+0

más fácil y más limpio –

1

Una vez tuve una situación similar (con archivos HTML, no XML). Pero terminé usando expresiones regulares para cada archivo HTML antes de ingresarlo a mi , con la línea de operación, para eliminar partes malformadas. Llegó a la mano y fue más fácil que luchar con la API. :)

Cuestiones relacionadas