.net 十六进制值0x00是无效字符
我正在从StringBuilder生成一个XML文档,基本上类似于:.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
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编码为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�.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("�", "[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)))