deserialize - Lectura de XML con un "&" en C#XMLDocument Object
deserialize xml string to object c# (6)
He heredado una aplicación web mal escrita que parece tener errores cuando intenta leer en un documento xml almacenado en la base de datos que tiene una "y" en él. Por ejemplo, habrá una etiqueta con los contenidos: "Prepago y cargo". ¿Hay alguna cosa secreta simple que hacer para que no obtenga un error de análisis de ese personaje, o me estoy perdiendo algo obvio?
EDITAR: ¿Hay otros caracteres que causen este mismo tipo de error de analizador por no estar bien formado?
Hay varios caracteres que harán que los datos XML se notifiquen como mal formados.
Desde w3schools :
Los caracteres como "<" y "&" son ilegales en elementos XML.
La mejor solución para la entrada en la que no puede confiar es que sea compatible con XML, es envolverla en etiquetas CDATA, por ejemplo
<![CDATA[This is my wonderful & great user text]]>
Todo en las etiquetas <![CDATA[
and ]]>
es ignorado por el analizador.
La aplicación web no tiene la culpa, el documento XML sí lo está. Los símbolos en XML deben codificarse como &
. No hacerlo es un error de sintaxis.
Editar: en respuesta a la pregunta de seguimiento, sí, hay todo tipo de errores similares. Por ejemplo, etiquetas desequilibradas, signos de menos de codificación no codificada, valores de atributo sin comillas, octetos fuera de la codificación de caracteres y varias rarezas de Unicode, referencias de entidades no reconocidas, etc. Para que cualquier analizador XML decente consuma un documento, ese documento debe estar bien formado. La especificación XML requiere que un analizador que encuentre un documento mal formado arroje un error fatal.
Las otras respuestas son todas correctas, y estoy de acuerdo con sus consejos, pero déjenme agregar una cosa:
POR FAVOR, no haga aplicaciones que funcionen con XML no bien formado, simplemente hace que el resto de nuestras vidas sea más difícil :).
Por supuesto, hay momentos en los que realmente no tienes opción si no tienes control sobre el otro extremo, pero realmente deberías tener un error fatal y quejarte muy fuerte y explícitamente sobre lo que se rompe cuando ocurre un evento de ese tipo. .
Probablemente podría dar un paso más y decir "¡Ack! Este XML está roto en estos lugares y por estas razones, así es como traté de arreglarlo para hacerlo bien formado: ...".
No estoy demasiado familiarizado con las API MSXML, pero la mayoría de los buenos analizadores XML te permitirán instalar manejadores de errores para que puedas atrapar el número exacto de línea / columna donde aparecen los errores junto con el mensaje y el código de error.
Puedes reemplazar & con &
O quizás también puedas usar secciones de CDATA .
Su base de datos no contiene documentos XML. Contiene algunos documentos XML bien formados y algunas cadenas que se parecen a XML para un ser humano.
Si es posible, debe solucionarlo; en particular, debe corregir cualquier proceso que esté generando documentos XML mal formados. Reparar el programa que lee datos de esta base de datos es simplemente colocar el fondo de pantalla sobre una grieta en la pared.
El problema es que el xml no está bien formado. El xml correctamente generado enumeraría los datos así:
Prepaid & Charge
Tuve que solucionar el mismo problema antes, y lo hice con esta expresión regular:
Regex badAmpersand = new Regex("&(?![a-zA-Z]{2,6};|#[0-9]{2,4};)");
Combine eso con una constante de cadena definida así:
const string goodAmpersand = "&";
Ahora puedes decir badAmpersand.Replace(<your input>, goodAmpersand);
Tenga en cuenta que un simple String.Replace("&", "&")
no es lo suficientemente bueno, ya que no puede saber de antemano para un documento dado si alguno y los caracteres se codificarán correctamente, incorrectamente o incluso ambos en el mismo documento.
Las capturas aquí son que tienes que hacer esto en tu documento xml antes de cargarlo en tu analizador, lo que probablemente signifique un pase extra a través de él. Además, no cuenta los símbolos dentro de una sección CDATA. Finalmente, solo atrapa los símbolos y no otros caracteres ilegales como <. Actualización: basado en el comentario, necesito actualizar la expresión para entidades con código hexadecimal (& # x ...;) también.
En cuanto a qué personajes pueden causar problemas, las reglas reales son un poco complejas. Por ejemplo, ciertos caracteres están permitidos en los datos, pero no como la primera letra de un nombre de elemento. Y no hay una lista simple de personajes ilegales. En cambio, una franja grande (no contigua) de UNICODE se define como legal , y cualquier cosa que esté fuera de eso es ilegal.
Entonces, cuando se trata de eso, debe confiar en que su fuente de documentos tendrá al menos cierta cantidad de cumplimiento y consistencia. Por ejemplo, he descubierto que las personas a menudo son lo suficientemente inteligentes como para asegurarse de que las etiquetas funcionen correctamente y escapen <, incluso si no saben eso y no están permitidas, de ahí su problema hoy. Sin embargo, lo mejor sería arreglarlo en la fuente.
Ah, y una nota sobre la sugerencia de CDATA: la usaría para asegurarme de que el xml que estoy creando está bien formado, pero cuando trato con xml existente desde afuera, encuentro que el método de expresión regular es más fácil.