偶尔SqlException:“XML解析:非法xml字符”发生在网站提交表单时

时间:2017-01-01 08:15:33

标签: c# sql-server xml

我们有一个网站,在我们的一个页面中,我们有一个带有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;文件)对这个问题有什么影响?

2 个答案:

答案 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>abc&#x3;def</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)。