我正在从StringBuilder生成一个XML文档,基本上如下所示:
string.Format("<text><row>{0}</row><col>{1}</col><textHeight>{2}</textHeight><textWidth>{3}</textWidth><data>{4}</data><rotation>{5}</rotation></text>稍后,类似于:
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
XmlNodeList labelSetNodes = document.GetElementsByTagName("labels");
for (int index = 0; index < labelSetNodes.Count; index++)
{
//do something
}所有的数据都来自一个数据库。最近,我对这个错误有几个问题:
十六进制值0x00是无效字符,第1行,位置nnnnn。
但这不一致。有时,一些“空白”数据会起作用。这些“错误”的数据可以在一些个人电脑上工作,但在其他电脑上就不行了。
在数据库中,数据始终是一个空字符串。它从来不是'null‘,在XML文件中,它以< data>< /data>的形式出现,也就是说,在开始和结束之间没有字符。(但不确定这是否可以依赖,因为我是从“立即”窗口是vis工作室,并将其粘贴到textpad)。
server的版本(2008年可能会失败,2005年也会工作)和排序也可能存在差异。不确定这些可能的原因是什么?
但完全相同的代码和数据有时会失败。知道问题在哪里吗?
发布于 2012-06-14 18:27:00
如果没有您的实际数据或源,我们将很难诊断出哪里出了问题。不过,我可以提出一些建议:
在XML的所有版本中,
考虑到您所写的内容,我怀疑将数据库数据转换为XML的任何内容都被破坏了;它正在传播非XML字符。
使用非XML字符(NULs、DEL、控制字符等)创建一些数据库条目。并在上面运行XML转换器。将XML输出到文件中,并在十六进制编辑器中查看它。如果其中包含非XML字符,则转换器将中断。修复它,或者,如果不能的话,创建一个预处理程序,它拒绝使用这样的字符输出。
如果转换器输出看起来很好,那么问题就在XML使用者中;它是在某个地方插入非XML字符。您将不得不将您的消费过程分解为不同的步骤,检查每个步骤的输出,并缩小引入不良字符的范围。
检查文件编码(用于UTF-16)
更新:我自己刚碰到了一个例子!所发生的事情是,生产者将XML编码为UTF16,而使用者则期望UTF8。由于UTF16使用0x00作为所有ASCII字符的高字节,而UTF8不使用,因此使用者将每秒钟的字节视为NUL。在我的例子中,我可以更改编码,但是建议所有的XML有效负载都从BOM开始。
发布于 2013-10-24 17:24:28
在我的例子中,它花了一些时间挖掘,但找到了。
我的上下文
我正在使用Elmah查看网站上的异常/错误日志。Elmah以大型XML文档的形式返回异常时服务器的状态。对于我们的报告引擎,我用XmlWriter很好地打印了XML。
在网站攻击期间,我注意到一些xml没有解析,并收到了这个'.', hexadecimal value 0x00, is an invalid character.异常。
NON-RESOLUTION: --我将文档转换为byte[],并将其消毒为0x00,但没有发现任何文档。
当我扫描xml文档时,发现了以下内容:
...
<form>
...
<item name="SomeField">
<value
string="C:\boot.ini�.htm" />
</item>
...有一个nul字节被编码为html实体�!
解析:为了修复编码,我在将�值加载到之前替换了它,因为加载它将创建nul字节,并且很难从对象中净化它。以下是我的整个过程:
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();
}经验教训:如果输入的数据是在条目上编码的,则使用关联的html实体对非法字节进行清理。
发布于 2015-07-17 16:26:27
为了补充Sonz上面的答案,下面的回答对我们很有用。
//Instead of
XmlString.Replace("�", "[0x00]");
// use this
XmlString.Replace("\x00", "[0x00]");https://stackoverflow.com/questions/11036799
复制相似问题