Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 十六进制值0x00是无效字符_.net_Sql Server_Xml - Fatal编程技术网

.net 十六进制值0x00是无效字符

.net 十六进制值0x00是无效字符,.net,sql-server,xml,.net,Sql Server,Xml,我正在从StringBuilder生成一个XML文档,基本上类似于: string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotati

我正在从StringBuilder生成一个XML文档,基本上类似于:

string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotation></text>
string.Format(“{0}{1}{2}{3}{4}{5}”
后来,类似于:

XmlDocument document = new XmlDocument();
document.LoadXml(xml);
XmlNodeList labelSetNodes = document.GetElementsByTagName("labels");
for (int index = 0; index < labelSetNodes.Count; index++)
{
    //do something
}
XmlDocument document=新的XmlDocument();
LoadXml(xml);
XmlNodeList labelSetNodes=document.GetElementsByTagName(“标签”);
对于(int index=0;index
所有数据都来自数据库。 最近我遇到了一些错误问题:

十六进制值0x00是无效字符,第1行,位置nnn

但这并不一致。 有时一些“空白”数据会起作用。 “故障”数据在某些PC上有效,但在其他PC上无效

在数据库中,数据始终为空字符串。它从不为“null” 在XML文件中,它显示为
,即在打开和关闭之间没有字符(但不确定这是否可靠,因为我正在从“立即”窗口将其拖动到vis studio并将其粘贴到textpad中)

sql server的版本(2008年可能会失败,2005年可能会工作)和排序规则也可能存在差异。 不确定这些是否是可能的原因


但是完全相同的代码和数据有时会失败。问题出在哪里呢?

如果没有您的实际数据或来源,我们将很难诊断出哪里出了问题。不过,我可以提出一些建议:

  • Unicode NUL(0x00)在所有XML版本中都是非法的,验证解析器必须拒绝包含它的输入
  • 尽管如此,现实世界中未经验证的XML可以包含任何形式的垃圾字节
  • XML 1.1允许零宽度和非打印控制字符(NUL除外),因此您无法在文本编辑器中查看XML 1.1文件并告诉它包含哪些字符
考虑到您所写的内容,我怀疑任何将数据库数据转换为XML的操作都被破坏了;它正在传播非XML字符

创建一些具有非XML字符(NUL、DEL、控制字符等)的数据库条目,并在其上运行XML转换器。将XML输出到文件并在十六进制编辑器中查看。如果该文件包含非XML字符,则转换器已断开。请修复该问题,或者,如果无法修复,请创建一个拒绝具有此类字符的输出的预处理器

如果转换器输出看起来不错,那么问题就出在XML使用者身上;它在某处插入了非XML字符。您必须将使用过程分解为单独的步骤,在每个步骤检查输出,并缩小引入坏字符的范围

检查文件编码(对于UTF-16)
更新:我自己刚刚遇到了一个这样的例子!发生的事情是,生产者将XML编码为UTF16,消费者期望UTF8。由于UTF16使用0x00作为所有ASCII字符的高字节,而UTF8不使用,消费者将每秒钟的字节都视为NUL。在我的情况下,我可以更改编码,但建议全部更改XML有效负载以BOM表开始。

我在ASP.NET应用程序中也遇到了相同的错误,当时我在Web.config文件中保存了一些unicode数据(印地语),并使用“unicode”编码保存


它为我修复了使用“UTF-8”编码保存Web.config文件时出现的错误。

在我的情况下,进行了一些挖掘,但找到了它

我的背景

我正在使用Elmah查看网站上的异常/错误日志。Elmah以大型XML文档的形式返回异常发生时服务器的状态。对于我们的报告引擎,我使用XmlWriter漂亮地打印XML

在一次网站攻击期间,我注意到一些XML没有进行解析,并接收到此
。“十六进制值0x00是无效字符。
异常

非解析:我将文档转换为
字节[]
并将其清除为0x00,但没有找到

扫描xml文档时,我发现以下内容:

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

经验教训:如果输入的数据在输入时是html编码的,则使用关联的html实体清除非法字节。

作为一种延迟回答:

我在上传报告时遇到SSRS ReportService2005.asmx的问题

    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
当您分配的字节数组至少比RDL(XML)文件大1字节时,就会出现问题

具体地说,我使用了一个C#到vb.net的转换器,它将

  btBuffer = new byte[fstrStream.Length];
进入

但是因为在C#中,数字表示数组中的元素数量,在VB.NET中,该数字表示数组的上限,所以我有一个多余的字节,导致了这个错误

因此,问题的解决方案很简单:

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

为了补充以上桑兹的回答,下面的内容对我们很有用

//Instead of 
XmlString.Replace("&#x0;", "[0x00]");
// use this
XmlString.Replace("\x00", "[0x00]");
我在这里使用IronPython(与.NET API相同),并以UTF-8的形式读取文件,以便正确处理BOM,为我解决了这个问题:

xmlFile = Path.Combine(directory_str, 'file.xml')
doc = XPathDocument(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))
它也适用于
XmlDocument

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

我也遇到过同样的问题,当我试图保存文件时,整个代码是完美的,但在最后一个过程中,出现了以下错误消息: “.”,十六进制值0x00是无效字符

1.查看开发工具,我在指定给sheets集合{Hoja1}、{Cartera}、{JennyG、{MariaD

2.然后我看到sheets名称中的最后一个字符“}”应该在算法过程中的任何时候丢失,以便从DataTable对象分配工作表的名称

3.在Name属性上,工作表的真实名称为“MariaD\0\0\0\0\0\0\0\0\0\0\0\0\0\0”,不支持属性名称中的隐藏字符“\0”


4.最后,解决方案是将当前字符替换为““所有工作表名称中的空字符串。

它是否真的显示为
,在“@DourHighArch”后面有一个空格?我发现唯一确定的方法是烧掉它。在从Outlook邮件项目中获取RTF正文并尝试将其序列化为XML后,这对我很有效
xmlFile = Path.Combine(directory_str, 'file.xml')
doc = XPathDocument(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))
doc = XmlDocument()
doc.Load(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))