我们有一个网站,在我们的一个页面中,我们有一个带有textarea和单选按钮的表单,它使用jQuery $.ajax()
调用Web处理程序(ashx)。此处理程序运行SQL-UPDATE并写入XML类型字段。 Textarea输入的文本被写入XML节点之一,单选按钮值写入该字段的其他节点。我在提交之前从输入的文本中删除非法的xml字符。在处理程序中,我再尝试用WebUtility.HtmlEncode()
删除非法字符
我的问题是,在某些情况下(我无法找到)客户端的文本输入和选择单选按钮提交将导致此错误:
SqlException:XML解析:第28行,第80个字符,非法xml字符
行号在28 - 29 - 30 - 31之间变化。这些行与通过提交此表单填充的xml节点相关。
错误发生在cmd.ExecuteNonQuery()
行。
我认为密钥是“字符80”,这个非法字符不应该存在于输入的文本中,因为XML解析错误总是发生在“字符80”中;如果它在输入文本上,它的位置会从错误变为错误,我也尝试所有单选按钮,它们都不会导致错误。 这是一个成功更新此页面的xml,您认为这个角色80指的是什么:
<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<hasAwardPenalty>true</hasAwardPenalty>
<TranslatorPayment>177800</TranslatorPayment>
<TranslatorPaids />
<ProofreaderPayment>53340</ProofreaderPayment>
<FileReplace>
<FileStatus>NONE</FileStatus>
<AddedTime>0001-01-01T00:00:00</AddedTime>
<UploadTime>0001-01-01T00:00:00</UploadTime>
<AffectOnPayment>false</AffectOnPayment>
<AffectOnScore>false</AffectOnScore>
</FileReplace>
<PaymentDetails>
<AddedTime>2015-02-05T12:02:47.5618565+03:30</AddedTime>
<PaymentCode>2be92023-9e69-4215-8394-1b81f5b7fc51</PaymentCode>
<PaymentId>60508</PaymentId>
<BankResponse>تراکنش موفق</BankResponse>
<BankName>PASARGAD</BankName>
<Amount>362700</Amount>
<Status>PAID</Status>
<AuthorityCode>6653537</AuthorityCode>
<Type>SHETAB</Type>
<OrderId>138587</OrderId>
</PaymentDetails>
<MyProperty>0</MyProperty>
<RequestDate xsi:nil="true" />
<TranslationPurpose>
<Id>aa8cf8be-2e7c-42d7-8208-1721bb07299c</Id>
<TargetCategory>OTHERS</TargetCategory>
<TargetDescription>سایر</TargetDescription>
<PublicationMethod>PERSONAL</PublicationMethod>
<Tone>Formal</Tone>
<Keynote>FluidityAndLoyality</Keynote>
<GuidLines>با سلام و احترام و تشکر از زحمات شما لطفا مطابق رزومه جهت کافرمایان خارجی تهیه شود.</GuidLines>
<References />
<Modified>true</Modified>
<AddedTime>2015-02-05T12:18:24.6859596+03:30</AddedTime>
</TranslationPurpose>
</Details>
更新:你认为Window的语言(控制面板 - &gt;语言 - &gt;更改日期时间&amp;数字 - &gt;管理员 - &gt;语言没有unicode程序)和IIS全球化(ASP) .NET - &gt; .NET全球化 - &gt;文件)对这个问题有什么影响?
答案 0 :(得分:3)
XmlSerializer
类生成可包含无效XML字符的XML(根据XML 1.0标准)。特别是,ASCII / Unicode范围内的控制字符从U + 0001到U + 001F(U + 0009,U + 000A和U + 000D除外)由XmlSerializer
编码为数字实体,但是非法。
SQL Server不接受非法XML字符,例如在此XML片段中:
<TargetDescription>abcdef</TargetDescription>
因此,要修复它,您可以通过删除这些非法字符来清除所有字符串:
class XmlHelper
{
static char[] IllegalXmlCharacters = new char[] {
'\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007',
'\u0008', '\u000b', '\u000c', '\u000e', '\u000f', '\u0010', '\u0011',
'\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', '\u0018',
'\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e', '\u001f'
};
static string RemoveIllegalXmlCharacters(string value)
{
string[] validParts = value.Split(IllegalXmlCharacters, StringSplitOptions.RemoveEmptyEntries);
return String.Join("", validParts);
}
}
要清理字符串,只需调用静态方法:
var cleanString = XmlHelper.RemoveIllegalXmlCharacters(dirtyString);
答案 1 :(得分:0)
最后,我设法通过与发出此错误的客户交谈来解决问题,并询问他在此页面上选择了哪些选项。 我设法在我们的一些html输入值中找到非法字符(/ h001f)。