válido valor hexadecimal error carácter 0x00 .net sql-server xml

.net - error - El valor hexadecimal 0x00 no es un carácter válido.



error valor hexadecimal 0x00 es un carácter no válido (6)

Como una especie de respuesta tardía:

He tenido este problema con SSRS ReportService2005.asmx al cargar un informe.

Public Shared Sub CreateReport(ByVal strFileNameAndPath As String, ByVal strReportName As String, ByVal strReportingPath As String, Optional ByVal bOverwrite As Boolean = True) Dim rs As SSRS_2005_Administration_WithFOA = New SSRS_2005_Administration_WithFOA rs.Credentials = ReportingServiceInterface.GetMyCredentials(strCredentialsURL) rs.Timeout = ReportingServiceInterface.iTimeout rs.Url = ReportingServiceInterface.strReportingServiceURL rs.UnsafeAuthenticatedConnectionSharing = True Dim btBuffer As Byte() = Nothing Dim rsWarnings As Warning() = Nothing Try Dim fstrStream As System.IO.FileStream = System.IO.File.OpenRead(strFileNameAndPath) btBuffer = New Byte(fstrStream.Length - 1) {} fstrStream.Read(btBuffer, 0, CInt(fstrStream.Length)) fstrStream.Close() Catch ex As System.IO.IOException Throw New Exception(ex.Message) End Try Try rsWarnings = rs.CreateReport(strReportName, strReportingPath, bOverwrite, btBuffer, Nothing) If Not (rsWarnings Is Nothing) Then Dim warning As Warning For Each warning In rsWarnings Log(warning.Message) Next warning Else Log("Report: {0} created successfully with no warnings", strReportName) End If Catch ex As System.Web.Services.Protocols.SoapException Log(ex.Detail.InnerXml.ToString()) Catch ex As Exception Log("Error at creating report. Invalid server name/timeout?" + vbCrLf + vbCrLf + "Error Description: " + vbCrLf + ex.Message) Console.ReadKey() System.Environment.Exit(1) End Try End Sub '' End Function CreateThisReport

El problema se produce cuando asigna una matriz de bytes que es al menos 1 byte más grande que el archivo RDL (XML).

Específicamente, usé un convertidor de C # a vb.net, que convirtió

btBuffer = new byte[fstrStream.Length];

dentro

btBuffer = New Byte(fstrStream.Length) {}

Pero como en C # el número denota el NÚMERO DE ELEMENTOS en la matriz, y en VB.NET, ese número denota el límite superior de la matriz, tuve un byte en exceso, causando este error.

Así que la solución del problema es simplemente:

btBuffer = New Byte(fstrStream.Length - 1) {}

Estoy generando un documento XML desde un StringBuilder, básicamente algo como:

string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotation></text>

Más tarde, algo como:

XmlDocument document = new XmlDocument(); document.LoadXml(xml); XmlNodeList labelSetNodes = document.GetElementsByTagName("labels"); for (int index = 0; index < labelSetNodes.Count; index++) { //do something }

Todos los datos provienen de una base de datos. Recientemente he tenido algunos problemas con el error:

El valor hexadecimal 0x00 es un carácter no válido, línea 1, posición nnnnn

Pero no es consistente. A veces algunos datos "en blanco" funcionarán. Los datos ''defectuosos'' funcionan en algunas PC, pero no en otras.

En la base de datos, los datos son siempre una cadena en blanco. Nunca es ''nulo'' y, en el archivo XML, aparece como < data>< /data> , es decir, no hay caracteres entre la apertura y el cierre. (pero no estoy seguro de si se puede confiar en esto ya que lo estoy sacando de la ventana "inmediata" que está en el estudio y pegándolo en el panel de texto).

Posiblemente hay diferencias en las versiones del servidor SQL (2008 es donde fallaría, 2005 funcionaría) y la intercalación también. ¿No está seguro si alguno de estos son causas probables?

Pero exactamente el mismo código y datos a veces fallarán. ¿Alguna idea de dónde radica el problema?


En mi caso, tomó un poco de excavación, pero lo encontró.

Mi contexto

Estoy viendo 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 documento XML grande. Para nuestro motor de informes, imprimo el XML con XmlWriter.

Durante un ataque al sitio web, noté que algunos xmls no estaban analizando y estaban recibiendo este ''.'', hexadecimal value 0x00, is an invalid character. excepción.

NO RESOLUCIÓN: Convierto el documento a un byte[] y lo desinfecté de 0x00, pero no encontró ninguno.

Cuando escanee el documento xml, encontré lo siguiente:

... <form> ... <item name="SomeField"> <value string="C:/boot.ini&#x0;.htm" /> </item> ...

Se codificó el byte nulo como una entidad html &#x0; !!!

RESOLUCIÓN: Para corregir la codificación, reemplacé el &#x0; valor antes de cargarlo en mi XmlDocument , porque al cargarlo se creará el byte nulo y será difícil limpiarlo del objeto. Aquí está todo mi proceso:

XmlDocument xml = new XmlDocument(); details.Xml = details.Xml.Replace("&#x0;", "[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 usando la entidad html asociada, si sus datos entrantes están html codificados en la entrada.


Estoy usando IronPython aquí (igual que la API .NET) y leo el archivo como UTF-8 para manejar adecuadamente la lista de materiales solucionada el problema para mí:

xmlFile = Path.Combine(directory_str, ''file.xml'') doc = XPathDocument(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))

Funcionaría también con el XmlDocument :

doc = XmlDocument() doc.Load(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))


Para agregar a la respuesta de Sonz anterior, lo siguiente funcionó para nosotros.

//Instead of XmlString.Replace("&#x0;", "[0x00]"); // use this XmlString.Replace("/x00", "[0x00]");


Sin su información o fuente real, será difícil para nosotros diagnosticar qué está mal. 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 basura malintencionada bytes 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 decir qué caracteres contiene.

Dado lo que escribiste, sospecho que todo lo que convierte los datos de la base de datos a XML está roto; Se está propagando caracteres no XML.

Cree algunas entradas de la base de datos con caracteres no XML (NUL, DEL, controles, y otros) y ejecute su convertidor XML en él. Muestra el XML en un archivo y míralo en un editor hexadecimal. Si esto contiene caracteres no XML, su convertidor está roto. Repárelo 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; es insertar caracteres no-XML en alguna parte. Tendrá que dividir su proceso de consumo en pasos separados, examinar el resultado en cada paso y reducir lo que está introduciendo a los caracteres malos.

Actualización: ¡Acabo de encontrarme con un ejemplo de esto! Lo que estaba sucediendo es que el productor estaba codificando 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 estaba viendo cada segundo byte como un NUL. En mi caso, podría cambiar la codificación, pero sugerí que todas las cargas útiles XML comiencen con una lista de materiales.


También obtengo el mismo error en una aplicación ASP.NET cuando guardé algunos datos Unicode (Hindi) en el archivo Web.config y los guardé con la codificación "Unicode".

Solucioné el error cuando guardé el archivo Web.config con la codificación "UTF-8".