Имя XML не может начинаться с символа "%"

Я пытаюсь отправить XML в веб-службу с помощью jQuery. Я получаю ответ, которого я не ожидал:

"Name Не может начинаться с символа '%', шестнадцатеричного значения 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
        );
    }
    });

ОБНОВЛЕНИЕ - Отправленные данные

<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

Как вы можете видеть, данные кодируются url. Я предполагаю, что там, где проблема, но я не знаю, как ее исправить. Любое руководство будет полезно. Спасибо!

Ответ 1

Ошибка возникает из-за пробела перед окончанием? как показано ниже

<?xml version="1.0" encoding="utf-8" ?>

Вы можете проверить свою строку xml и вернуть ее немного больше tidy способом, указанным в фрагменте.

var xmlString ='<?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>';
var xmlDoc = $.parseXML( xmlString );
var newxmlString = (new XMLSerializer()).serializeToString(xmlDoc);
console.log([xmlString,newxmlString]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ответ 2

Я взглянул на код и нашел несколько проблем, которые нужно изучить.

  • В коде функции, который вы опубликовали, отсутствует закрытие '}); чтобы закрыть функцию и ajax-вызов соответствующим образом. Это может быть связано с проблемой копирования-вставки, когда вы разместили свой вопрос. Но, чтобы быть ясным. Для его работы должны быть следующие блоки кода.

    $(function() {
        var xmlStr = 'validxml', guid;
    
        $.ajax({
            option1:"option1"
        });
    //basically, this last closing bracket/paren was missing in the sample code
    });
    
  • XML, который вы публикуете, кажется недействительным. Существует открытый тег <TransactionSetup>, но, похоже, в конце есть два закрывающих тега </TransactionSetup>. Скорее всего, это не вызовет проблем с тем, как jQuery отправляет данные, но это, вероятно, вызовет проблемы на стороне сервера, когда придет время десериализации XML.

  • Данные, которые вы показываете как опубликованные, любопытны по нескольким причинам. Во-первых, он не включает пролог XML в начале показаний переменной javascript. (Вместо этого он начинается с <TransactionSetup>. Во-вторых, кодировка нечетна, так как кажется, что вещи после атрибута xmlns получают кодировку, но ничего раньше. Я думаю, что источником вашей проблемы, основанной на сообщении об ошибке, является то, что сервер имеет очень трудное время, анализируя XML, потому что он не кодируется в начале, а затем внезапно становится закодированным частично. Это имеет смысл на основе сообщения об ошибке "Имя не может начинаться с символа" % "", поскольку он сталкивается с закодированным углом скобки в вашем XML, если этого не ожидается.

Моя рекомендация заключалась в следующем:

  • Убедитесь, что все ваши скобки/скобки верны.
  • Убедитесь, что XML все допустимо (правильное открытие и сопоставление закрывающих тегов).
  • Затем приступайте к устранению проблем, если они все еще существуют. Первое, что я предлагаю изменить, - это удалить параметр contentType: "text/xml" полностью из вызова ajax(), поскольку это обычно не то, что вам нужно установить или изменить при публикации XML в моем опыте. Я предполагаю, что если вы удалите этот вариант, вы будете ближе к определению проблемы. Если удаление не помогает, попробуйте изменить его на contentType: "application/xml".

Ответ 3

Вы пытались отправить XML document вместо string?

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

Ответ 4

Данные, которые будут опубликованы, на самом деле не являются xml, это объект, который имеет свойство xml. Поэтому настройка contentType: "text/xml" не подходит для вашего запроса ajax.

По умолчанию данные передаются в данные как объект (технически, ничего, кроме строки) будут обработаны и преобразованы в строку запроса, подходящую для типа содержимого по умолчанию "Применение/х-WWW-форм-urlencoded". Чтобы предотвратить отправку данных в URL-кодированном формате, вы могли бы рассмотрите возможность конвертировать ваши опубликованные данные в строку json и изменить параметр contentType на "application/json; charset = 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
        );
    }
    });

Я создал образец по этой ссылке https://jsfiddle.net/b6f4tuyx/1/, вы можете проверить его.