Javascript XML名称不能以';%开头';性格

Javascript XML名称不能以';%开头';性格,javascript,jquery,post,url-encoding,Javascript,Jquery,Post,Url Encoding,我正在尝试使用jQuery将XML发布到web服务。我得到了意想不到的回复: 名称不能以“%”字符开头,十六进制值0x25。第1行,位置65 代码 $(function() { var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</Account

我正在尝试使用jQuery将XML发布到web服务。我得到了意想不到的回复:

名称不能以“%”字符开头,十六进制值0x25。第1行,位置65

代码

$(function() {
    var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>',
        guid;
    $.ajax({
        type: 'POST',
        url: 'webserviceurl',
        contentType: "text/xml",
        dataType: "xml",
        data: {
            Action: $('#Action').val(),
            IsAjax: $('#IsAjax').val(),
            xml: xmlStr,
        },
        success: function(response) {
            guid = response;
            console.log('success' + guid);
        },
        error: function (jqXHR, tranStatus, errorThrown) {
        console.log(
            'Status: ' + jqXHR.status + ' ' + jqXHR.statusText + '. ' +
            'Response: ' + jqXHR.responseText
        );
    }
    });
$(函数(){
var xmlStr='1043155obsfucatedobsfucatedobsfucated1.0Test012532211SPI_cartotal11obsfucatedBody{左边距:50px;字体系列:arial;字体大小:大;边框:无;},
guid;
$.ajax({
键入:“POST”,
url:'webserviceurl',
contentType:“text/xml”,
数据类型:“xml”,
数据:{
动作:$(“#动作”).val(),
IsAjax:$('#IsAjax').val(),
xml:xmlStr,
},
成功:功能(响应){
guid=响应;
console.log('success'+guid);
},
错误:函数(jqXHR、tranStatus、errorshown){
console.log(
'状态:'+jqXHR.Status+'+jqXHR.statusText+'。'+
'响应:'+jqXHR.responseText
);
}
});
更新-发布数据

<TransactionSetup xmlns="https://www.obsfucated.com"%3E%20%3CCredentials%3E%20%3CAccountID%3E1223135%3C/AccountID%3E%20%3CAccountToken%3EA9A22221CBE222ED0E287D6F34B0222E0F928E4DDF6C37B945CE05F78054DF95966FC201%3C/AccountToken%3E%20%3CAcceptorID%322228907%3C/AcceptorID%3E%20%3C/Credentials%3E%20%3CApplication%3E%20%3CApplicationID%3E8003%3C/ApplicationID%3E%20%3CApplicationVersion%3E1.0%3C/ApplicationVersion%3E%20%3CApplicationName%3EHostedPayments.CSharp%3C/ApplicationName%3E%20%3C/Application%3E%20%3CTerminal%3E%20%3CTerminalID%3E01%3C/TerminalID%3E%20%3CCardholderPresentCode%3E2%3C/CardholderPresentCode%3E%20%3CCardInputCode%3E5%3C/CardInputCode%3E%20%3CTerminalCapabilityCode%3E3%3C/TerminalCapabilityCode%3E%20%3CTerminalEnvironmentCode%3E2%3C/TerminalEnvironmentCode%3E%20%3CCardPresentCode%3E2%3C/CardPresentCode%3E%20%3CMotoECICode%3E1%3C/MotoECICode%3E%20%3CCVVPresenceCode%3E1%3C/CVVPresenceCode%3E%20%3C/Terminal%3E%20%3CTransaction%3E%20%3CTransactionAmount%3E0.20%3C/TransactionAmount%3E%20%3C/Transaction%3E%20%3CTransactionSetup%3E%20%3CTransactionSetupMethod%3E1%3C/TransactionSetupMethod%3E%20%3CEmbedded%3E1%3C/Embedded%3E%20%3CAutoReturn%3E1%3C/AutoReturn%3E%20%3CReturnURL%3Ehttp://shop.masterssupply.net/webcattest/WebCatPageServer.exe%3C/ReturnURL%3E%20%3CCustomCss%3E%20.tdHeader%20{%20%20%20%20%20background-color:%20%23F8F8F8;%20%20%20%20%20padding:%205px;%20%20%20%20%20font-weight:%20bold;%20}%20.tdLabel%20{%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20text-align:%20right;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%2010px;%20%20%20%20%20padding-bottom:%2010px;%20}%20.tdField%20{%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%2010px;%20%20%20%20%20padding-bottom:%2010px;%20}%20.content%20{%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%205px;%20%20%20%20%20padding-bottom:%205px;%20%20%20%20%20border-left-style:%20none;%20%20%20%20%20border-left-width:%20none;%20%20%20%20%20border-left-color:%20none;%20%20%20%20%20border-right-style:%20none;%20%20%20%20%20border-right-width:%20none;%20%20%20%20%20border-right-color:%20none;%20}%20.tdTransactionButtons%20{%20%20%20%20%20text-align:%20left;%20%20%20%20%20padding-top:%205px;%20%20%20%20%20height:%2035px;%20%20%20%20%20border-top-style:%20none;%20%20%20%20%20border-top-width:%20none;%20%20%20%20%20border-top-color:%20none;%20%20%20%20%20vertical-align:%20middle;%20}%20body%20{%20%20%20%20%20margin-left:%20none;%20%20%20%20%20font-family:%20arial;%20%20%20%20%20font-size:%2012px;%20%20%20%20%20border:%20none;%20}%20.buttonEmbedded:link%20{%20%20%20%20%20font-size:%2013px;%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%204px;%20%20%20%20%20padding-bottom:%204px;%20%20%20%20%20border:%204px%20solid%20%23ce701a;%20%20%20%20%20color:%20%23ffffff;%20%20%20%20%20background-color:%20%23ce701a;%20%20%20%20%20text-decoration:%20none;%20%20%20%20%20border-top-style:%20solid;%20%20%20%20%20border-top-width:%201px;%20%20%20%20%20border-top-color:%20%23ce701a;%20%20%20%20%20border-right-color:%20%23ce701a;%20%20%20%20%20border-left-color:%20%23ce701a;%20%20%20%20%20border-bottom-color:%20%23ce701a;%20}%20.buttonCancel{%20%20%20%20%20border:%201px%20solid%20%23444;%20%20%20%20%20font-weight:%20bold;%20%20%20%20%20color:%20%23fff;%20%20%20%20%20border:%201px%20solid%20%23444;%20%20%20%20%20background-color:%20%237c7c7c;%20%20%20%20%20box-shadow:%20none;%20%20%20%20%20border-radius:%200px;%20%20%20%20%20padding:%206px%2012px;%20%20%20%20%20font-size:%2014px;%20%20%20%20%20line-height:%204.428571;%20%20%20%20%20text-decoration:%20none;%20%20%20%20%20padding-right:%2010px;%20%20%20%20%20padding-left:%2010px;%20%20%20%20%20padding-top:%204px;%20%20%20%20%20padding-bottom:%204px;%20%20%20%20%20border-top-style:%20solid;%20%20%20%20%20border-top-width:%201px;%20%20%20%20%20border-top-color:%20%23838383;%20%20%20%20%20border-right-color:%20%23838383;%20%20%20%20%20border-left-color:%20%23838383;%20%20%20%20%20border-bottom-color:%20%23838383;%20}%20.buttonCancel:link%20{%20%20%20%20%20color:%20%23fff;%20}%20.buttonCancel:visited%20{%20%20%20%20%20color:%20%23fff;%20}%20%3C/CustomCss%3E%20%3C/TransactionSetup%3E%20%3C/TransactionSetup%3E%20

您是否尝试过发送
XML文档而不是
字符串

    data: {
        Action: $('#Action').val(),
        IsAjax: $('#IsAjax').val(),
        xml: $.parseXML(xmlStr),
    }

我看了一下代码,发现了一些需要研究的问题

  • 您发布的函数代码缺少结束符“}”);'适当地结束函数和ajax调用。这可能是因为在发布问题时出现了复制粘贴问题。但是,要明确的是。要让它工作,需要有以下代码块

    $(function() {
        var xmlStr = 'validxml', guid;
    
        $.ajax({
            option1:"option1"
        });
    //basically, this last closing bracket/paren was missing in the sample code
    });
    
  • 您发布的XML似乎无效。有一个开始的
    标签,但结尾似乎有两个结束的
    标签。这很可能不会导致jQuery如何发布数据的问题,但在对XML进行反序列化时,可能会导致服务器端出现问题

  • 出于几个原因,您所发布的数据令人好奇。首先,它在javascript变量显示的开头不包含XML序言。(相反,它只是从
    开始。其次,编码是奇怪的,因为xmlns属性之后的内容似乎得到了编码,而在此之前什么都没有。我认为,基于错误消息,问题的根源是服务器在解析XML时遇到了非常困难的问题,因为它在开始和结束时都没有编码突然在中途被编码。根据错误消息“名称不能以“%”字符开头”,这是有意义的,因为它在XML中遇到了编码的尖括号,而它不希望这样

  • 我的建议是:

  • 验证所有右括号/括号是否正确
  • 验证XML是否全部有效(正确的开始标记和匹配的结束标记)
  • 然后,如果问题仍然存在,就开始对其进行故障排除。我建议更改的第一件事是完全从ajax()中删除contentType:“text/xml”选项调用,因为根据我的经验,在发布XML时通常不需要设置或更改此选项。我猜如果删除此选项,您将更接近于确定问题。如果删除此选项没有帮助,请尝试将其更改为contentType:“application/XML”

  • 要发布的数据实际上不是xml,而是具有xml属性的对象。因此设置contentType:“text/xml”不适合您的ajax请求

    默认情况下,数据作为对象传递给数据(从技术上讲,是字符串以外的任何对象) 将被处理并转换为符合默认内容类型的查询字符串 “application/x-www-form-urlencoded”。为了防止数据以url编码的格式发送,您可以 考虑将发布的数据转换为JSON字符串,并将设置<强> CtrordType < /强>更改为 “应用程序/json;字符集=utf-8”

    $(function() {
        var xmlStr = '<?xml version="1.0" encoding="utf-8" ?><TransactionSetup xmlns="obsfucated"><Credentials><AccountID>1043155</AccountID><AccountToken>obsfucated</AccountToken><AcceptorID>obsfucated</AcceptorID></Credentials><Application><ApplicationID>obsfucated</ApplicationID><ApplicationVersion>1.0</ApplicationVersion><ApplicationName>Test</ApplicationName></Application><Terminal><TerminalID>01</TerminalID><CardholderPresentCode>2</CardholderPresentCode><CardInputCode>5</CardInputCode><TerminalCapabilityCode>3</TerminalCapabilityCode><TerminalEnvironmentCode>2</TerminalEnvironmentCode><CardPresentCode>2</CardPresentCode><MotoECICode>1</MotoECICode><CVVPresenceCode>1</CVVPresenceCode></Terminal><Transaction><TransactionAmount>SPI_CartTotalFinal</TransactionAmount></Transaction><TransactionSetup><TransactionSetupMethod>1</TransactionSetupMethod><Embedded>1</Embedded><AutoReturn>1</AutoReturn><ReturnURL>Obsfucated</ReturnURL><CustomCss>body{margin-left:50px;font-family:arial;font-size:large;border:none;}</CustomCss></TransactionSetup></TransactionSetup>',
            guid;
        $.ajax({
            type: 'POST',
            url: 'webserviceurl',
            contentType: "application/json; charset=utf-8",
            dataType: "xml",
            data: JSON.stringify({
                Action: $('#Action').val(),
                IsAjax: $('#IsAjax').val(),
                xml: xmlStr,
            }),
            success: function(response) {
                guid = response;
                console.log('success' + guid);
            },
            error: function (jqXHR, tranStatus, errorThrown) {
            console.log(
                'Status: ' + jqXHR.status + ' ' + jqXHR.statusText + '. ' +
                'Response: ' + jqXHR.responseText
            );
        }
        });
    
    $(函数(){
    
    var xmlStr=',您可以检查它。

    产生错误的原因是结尾?符号前面有空格,如下所示

    <?xml version="1.0" encoding="utf-8" ?>
    
    
    
    您可以检查xml字符串,并使用代码段中提供的方式将其返回得更整洁一些

    var xmlString='1043155obsfucatedobsfucatedobsfucated1.0test012532211 SPI_cartotal11obsfucatedBody{左边距:50px;字体系列:arial;字体大小:大;边框:无;}';
    var xmlDoc=$.parseXML(xmlString);
    var newxmlString=(新XMLSerializer()).serializeToString(xmlDoc);
    log([xmlString,newxmlString]);

    这有时可能是由于您的IIS站点配置不正确造成的。请尝试检查是否为您的站点指定了正确的.NET版本。谢谢。我确实尝试过切换站点正在使用的.NET版本,但没有效果。我已安装了2.0和4.0,并尝试了这两种版本。我认为发布的数据不是json。但是,e即使是json,“数据类型”选项与发布的数据类型无关,它的作用是告诉jQuery希望从服务器返回什么类型的响应。请参阅jQuery文档。@Fitz非常感谢您的反馈。我已经编辑了我的答案。xml序言结尾处的?之前的空格仍然是有效的xml。请参阅此处的xml规范:。此外,当我运行此答案中提供的代码段时,它仍然与原始字符串位于同一位置,因此我认为空间不是问题所在,也没有被其他序列化步骤删除。@Fitz如果运行代码段,您将看到空间不在那里。您是否看到两个stri的控制台输出ngs?我现在看到了这两个字符串--我很抱歉。我看到了空白处的变化,但我仍然相信根据XML规范,其中任何一个仍然是有效的XML。@Fitz在大多数情况下,如果发生此错误意味着XML格式不正确,则涉及XML和某种web服务。请从那里释放空白处,然后自己重新尝试查看。@Fit仔细看一看