Ya no necesitas buscar más por todo internet ya que estás al lugar indicado, poseemos la solución que necesitas pero sin problema.
Solución:
Sin su fuente o datos reales, será difícil para nosotros diagnosticar qué es lo que está fallando. Sin embargo, puedo hacer algunas sugerencias:
- Unicode NUL (0x00) es ilegal en todas las versiones de XML y los analizadores de validación deben rechazar la entrada que lo contiene.
- A pesar de lo anterior; El XML no validado del mundo real puede contener cualquier tipo de bytes basura mal formados imaginables.
- XML 1.1 permite caracteres de control de ancho cero y no imprimibles (excepto NUL), por lo que no puede mirar un archivo XML 1.1 en un editor de texto y saber qué caracteres contiene.
Dado lo que escribió, sospecho que lo que sea que convierta los datos de la base de datos a XML está roto; está propagando caracteres que no son XML.
Cree algunas entradas de la base de datos con caracteres que no sean XML (NUL, DEL, caracteres de control, etc.) y ejecute su convertidor XML en él. Envíe el XML a un archivo y mírelo en un editor hexadecimal. Si esto contiene caracteres que no son XML, su convertidor está roto. Corríjalo o, si no puede, cree un preprocesador que rechace la salida con dichos caracteres.
Si la salida del convertidor se ve bien, el problema está en su consumidor XML; está insertando caracteres que no son XML en alguna parte. Tendrá que dividir su proceso de consumo en pasos separados, examinar la salida en cada paso y reducir lo que está introduciendo a los personajes malos.
Comprobar la codificación del archivo (para UTF-16)
Actualización: ¡Acabo de encontrarme con un ejemplo de esto! Lo que sucedía es que el productor codificaba el XML como UTF16 y el consumidor esperaba UTF8. Dado que UTF16 usa 0x00 como byte alto para todos los caracteres ASCII y UTF8 no, el consumidor veía cada segundo byte como NUL. En mi caso, podría cambiar la codificación, pero sugerí que todas las cargas útiles XML comenzaran con una lista de materiales.
En mi caso, me tomó un poco de excavación, pero lo encontré.
mi contexto
Estoy mirando los registros de excepción/error del sitio web usando Elmah. Elmah devuelve el estado del servidor en el momento de la excepción, en forma de un gran documento XML. Para nuestro motor de informes, imprimo el XML con XmlWriter.
Durante un ataque a un sitio web, noté que algunos xml no se analizaban y recibían esto '.', hexadecimal value 0x00, is an invalid character.
excepción.
NO RESOLUCIÓN: Convertí el documento a un byte[]
y lo desinfectó de 0x00, pero no encontró ninguno.
Cuando escaneé el documento xml, encontré lo siguiente:
...
Estaba el byte nulo codificado como una entidad html !!!
RESOLUCIÓN: Para arreglar la codificación, reemplacé el valor antes de cargarlo en mi
XmlDocument
, porque cargarlo creará el byte nulo y será difícil desinfectarlo del objeto. Aquí está todo mi proceso:
XmlDocument xml = new XmlDocument();
details.Xml = details.Xml.Replace("", "[0x00]"); // in my case I want to see it, otherwise just replace with ""
xml.LoadXml(details.Xml);
string formattedXml = null;
// I have this in a helper function, but for this example I have put it in-line
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings
OmitXmlDeclaration = true,
Indent = true,
IndentChars = "t",
NewLineHandling = NewLineHandling.None,
;
using (XmlWriter writer = XmlWriter.Create(sb, settings))
xml.Save(writer);
formattedXml = sb.ToString();
LECCIÓN APRENDIDA: desinfecte los bytes ilegales utilizando la entidad html asociada, si sus datos entrantes están codificados en html en la entrada.
Para agregar a la respuesta anterior de Sonz, lo siguiente funcionó para nosotros.
//Instead of
XmlString.Replace("", "[0x00]");
// use this
XmlString.Replace("x00", "[0x00]");
Nos encantaría que puedieras mostrar este enunciado si te valió la pena.