Tshumore Ответов: 4

Отсутствует ошибка конечного тега, даже если она существует


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

Log Written Date: 29/1/2020 1:23:59 PM

Error Line No : ine 101

Error Message: SoapException

Exception Type: System.Web.Services.Protocols.SoapException

Error Location : Exception Caught during processing: The element type "SSC" must be terminated by the matching end-tag "</SSC>".


Это несмотря на то, что мой XML хорошо сформирован (по крайней мере, в коде).
Вот как я отправляю полезную нагрузку :

transactions = GetContracts();
           try
           {
               StringBuilder sb = new StringBuilder();
               sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
               sb.Append("<SSC>");
               sb.Append("<User>");
               sb.Append("<Name>" + Helpers.parameters.sscUser + "</Name>");
               sb.Append("</User>");
               sb.Append("</SunSystemsContext>");
               sb.Append("<BusinessUnit>" + Convert.ToString(Helpers.parameters.busUnit) + "</BusinessUnit>");
               sb.Append("<BudgetCode>" + Convert.ToString(Helpers.parameters.budgetCode) + "</BudgetCode>");
               sb.Append("</SunSystemsContext>");
               sb.Append("<Payload>");

               foreach (Contracts contract in transactions) {

                   sb.Append("<Ledger>");
                   sb.Append("<EntryPeriod>" + contract.Period + "</EntryPeriod>");
                   sb.Append("<TransactionAmount>" + contract.Amount + "</TransactionAmount>");
                   sb.Append("<AnalysisCode1>" + contract.CompanyCode + "</AnalysisCode1>");

                   sb.Append("</Ledger>");

               }

               sb.Append("</Payload>");
               sb.Append("</SSC>");
               var inputPayload = sb.ToString();
               if (authVoucher != null)
               {
                   bool result = securityProvider.Validate(authVoucher);

                   if (result == true)
                   {


                     //some logic here
                       try

                       {
                       //execute routine and retrieve response to outresult
                           string outresult = componentExecutor.Execute(authVoucher, "", ComponentName, ComponentMethod, "", inputPayload);

                       }
                        catch (Exception ex)
                       {
                           ExceptionLogging.SendErrorToText(ex);
                           string outresult = ex.Message.ToString();
                           Console.WriteLine(outresult);


Что я уже пробовал:

Я вставил образец своей полезной нагрузки в онлайн-валидатор XML, и я получаю ошибку корневой элемент отсутствует.
Это кажется проблемой связанной с окружающей средой и из всех решений которые я искал мне не повезло :

1. Я проверил, что мой .пользователь файла не имеет значения
2. я проверил, что мой файл .csproj не пуст
3. Поиск линии
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
в файле .csproj, но его даже там нет. У меня есть предложение прокомментировать этот файл на каком-то форуме

3. переход C:\Users\<пользователь=""&ГТ;\документы\Visual студии &ЛТ;против версии=""&ГТ; резервное копирование\файлы\&ЛТ;проект="">, Чтобы проверить, если есть оба Восстановленный один Оригинал файлы. То, что я получаю, - это два набора файлов обоих типов
Original-May-18-2018-1209PM.<your project>.csproj
Recovered-May-18-2018-1209PM.<your project>.csproj
и как было предложено я переименовал его в Оригинал установите значение <my_project>.csproj, как было предложено

Я stii получаю ту же ошибку проверки XML, несмотря на эти изменения.

Что я упускаю?

4 Ответов

Рейтинг:
4

Richard Deeming

Это хороший пример того, почему вы не должны использовать a StringBuilder чтобы построить XML-документ. :)

(Вы также должны надеяться, что ни одно из значений, которые вы вставляете, никогда не содержит символов, которые должны быть закодированы, иначе вы все равно получите недопустимый XML-документ.)

С помощью XLinq[^] было бы намного проще:

XDocument document = new XDocument(
    new XDeclaration("1.0", "UTF-8", null),
    new XElement("SSC",
        new XElement("SunSystemsContext",
            new XElement("User",
                new XElement("Name", Helpers.parameters.sscUser)
            ),
            new XElement("BusinessUnit", Helpers.parameters.busUnit),
            new XElement("BudgetCode", Helpers.parameters.budgetCode)
        ),
        new XElement("Payload",
            transactions.Select(contract => new XElement("Ledger",
                new XElement("EntryPeriod", contract.Period),
                new XElement("TransactionAmount", contract.Amount),
                new XElement("AnalysisCode1", contract.CompanyCode)
            ))
        )
    )
);

string inputPayload = document.ToString();


Maciej Los

5ed!

CHill60

Я бы проголосовал за вас дважды, если бы мог - ОП только что столкнулся с проблемой "у меня есть амперсанд в моем тексте", которую вы более или менее предсказали

Maciej Los

Я тоже ;)

Рейтинг:
31

phil.o

Вы можете попытаться удалить линии

sb.Append("</SunSystemsContext>");
(есть два из них) и посмотреть, что происходит, потому что там, кажется, нет открывающих тегов для этих закрывающих.


Maciej Los

5!

phil.o

Спасибо :)

Рейтинг:
23

jimmson

Ваш XML-файл не очень хорошо отформатирован.

Вы дважды добавили строку: sb.Append("</SunSystemsContext>");
Первый из них должен быть sb.Append("<SunSystemsContext>");

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


CHill60

Перекрытие! И это действительно решает проблему кстати :-)

Maciej Los

5!

Рейтинг:
2

CHill60

sb.Append("<Name>" + Helpers.parameters.sscUser + "</Name>");
sb.Append("</User>");
sb.Append("</SunSystemsContext>");
Там нет стартового тега для SunSystemsContextтак и должно быть
sb.Append("<Name>" + Helpers.parameters.sscUser + "</Name>");
sb.Append("</User>");
sb.Append("<SunSystemsContext>");


Tshumore

Опечатка, я исправил по мере необходимости теперь я получаю исключение, пойманное во время обработки: имя сущности должно немедленно следовать за '&' в ссылке на сущность. на линии
string outresult = componentExecutor.Execute(authVoucher, "", ComponentName, ComponentMethod, "", inputPayload);

CHill60

См.комментарий @Richard-Deeming в решении 4 "(Вам также лучше надеяться, что ни одно из вставляемых вами значений никогда не содержит символов, которые необходимо закодировать, иначе вы все равно получите недопустимый XML-документ.)"
Где-то в вашем тексте есть символ амперсанда, и синтаксический анализатор начинает искать сущность, следующую за ним ... например, & l t ; указывает на символ <, а & amp ; указывает на &;

Maciej Los

5!