Ошибка разбора XML-строки в xDocument

Я получаю строку XML от контроллера моего веб-API, который построен следующим образом:

private string CreateXDoc(IEnumerable<PassedJSONConverted> passed)
    {
        XNamespace xmlns = "http://host.adp.com";

        var doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));

        var jobListElement = new XElement(xmlns + "JobXML");

        foreach (var objectItem in passed)
        {
            var loopElement = new XElement(xmlns + "JobsXML", new XElement(xmlns + "ID", objectItem.ID.ToString()), new XElement(xmlns + "Name", objectItem.Name), new XElement(xmlns + "Age", objectItem.Age.ToString()), new XElement(xmlns + "JobTitle", objectItem.JobTitle), new XElement(xmlns + "StartDate", objectItem.StartDate));

            jobListElement.Add(loopElement);
        }

        doc.Add(jobListElement);

        //Format without \n's
        return doc.ToString(SaveOptions.DisableFormatting);
    }

Это хорошо, и XML установлен так, как показано:

- <JobXML xmlns="http://host.xxx.com">
 - <JobsXML>
    <ID>1</ID> 
    <Name>Dave</Name> 
    <Age>23</Age> 
    <JobTitle>Developer</JobTitle> 
    <StartDate>10/24/2013 6:40:28 AM</StartDate> 
  </JobsXML>
- <JobsXML>
    <ID>2</ID> 
    <Name>John</Name> 
    <Age>44</Age> 
    <JobTitle>QA</JobTitle> 
    <StartDate>10/24/2013 6:40:28 AM</StartDate> 
  </JobsXML>
- <JobsXML>
    <ID>3</ID> 
    <Name>Dave</Name> 
    <Age>23</Age> 
    <JobTitle>Senior Developer</JobTitle> 
    <StartDate>10/24/2013 6:40:28 AM</StartDate> 
  </JobsXML>
 </JobXML>

Когда я тогда возвращаю это как строку и пытаюсь проанализировать это обратно в xDoc как показано:

private static string HandleResponse(HttpWebResponse httpResponse)
    {
        using (var responseReader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))

        {
            string responsePayload = responseReader.ReadToEnd();

            var newxDoc = XDocument.Parse(responsePayload);

            return responsePayload;
        }
    }

Строка 'responsePayLoad' во время выполнения устанавливается следующим образом:

 "<JobXML xmlns=\"http://host.adp.com\"><JobsXML><ID>1</ID><Name>Dave</Name><Age>23</Age><JobTitle>Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>2</ID><Name>John</Name><Age>44</Age><JobTitle>QA</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>3</ID><Name>Dave</Name><Age>23</Age><JobTitle>Senior Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML></JobXML>"

Это дает мне исключение для объекта 'newxDoc':

XmlException не обрабатывается. Данные на корневом уровне недействительны. Строка 1, позиция 1.

Может кто-нибудь сказать мне, где я иду не так?

4 ответа

Решение

Проблема в том, что ваша строка responsePayLoad не является допустимым XML.

Ваша проблема здесь:

"<JobXML xmlns=\"http://host.adp.com\">

Наличие символа кавычки в начале и конце строки, а также обратная косая черта перед кавычками приводит к неправильному формату XML. Если ваша строка не имеет этих кавычек в начале и в конце и обратная косая черта XML будет действительной, т.е. это сделает XML правильно сформированным:

<JobXML xmlns="http://host.adp.com">...<\JobXML>

Что касается того, почему возникает эта проблема, это может быть связано с тем, как вы создаете свой XDocument. Пример в документации Microsoft здесь указывает, что экземпляр XDocument, который использует определенный XDeclaration, должен быть создан с использованием следующего конструктора:

XDocument(XDeclaration, Object[])

Так что я бы попробовал пересмотреть ваш код, чтобы сделать нас из этого метода, например

private string CreateXDoc(IEnumerable<PassedJSONConverted> passed)
{
    XNamespace xmlns = "http://host.adp.com";

    var xdec = new XDeclaration("1.0", "utf-8", "yes");

    var jobListElement = new XElement(xmlns + "JobXML");

    foreach (var objectItem in passed)
    {
        var jobXml = new XElement(xmlns + "JobsXML", 
                            new XElement(xmlns + "ID", objectItem.ID.ToString()), 
                            new XElement(xmlns + "Name", objectItem.Name), 
                            new XElement(xmlns + "Age", objectItem.Age.ToString()), 
                            new XElement(xmlns + "JobTitle", objectItem.JobTitle), 
                            new XElement(xmlns + "StartDate", objectItem.StartDate));

        jobListElement.Add(jobXml);
    }

    var doc = new XDocument(
        xdec,
        new XElement(jobListElement)
    );

    //Format without new lines
    return doc.ToString(SaveOptions.DisableFormatting);
}

Если это не работает, также попробуйте отключить форматирование отключения в CreateXDoc, т.е.

return doc.ToString();

Попробуйте добавить В начало вашей строки XML.

Не беспокойтесь о экранированных кавычках, они есть, потому что ваш XML заключен в строку.

Как вы и просили, парсинг строки XML в xdocument:

просто попробуйте этот код

 XDocument document = XDocument.Parse(xml);

но у меня есть проблема, если это хорошо для огромной строки XML, такой как XML с более чем одной сотней строк кодов. Я попробовал этот метод для документа XML с 10000 строк кода, и это заняло 1,5 секунды

Два приведенных выше ответа помогут разобраться

Когда я повторил сценарий XML, я получил эту ошибку

Ошибка синтаксического анализа XML: неправильно сформированное расположение: строка без названия 1.xml № 2, столбец 15: http://host.adp.com\">1Dave23 --------------^ Developer10/24/2013 6:45:22 AM2John44QA10/24/2013 6:45:22 AM3Dave23Senior Developer10/24/2013 6:45:22 AM

это правильная форма

<?xml version="1.0" encoding="utf-8"?>
<JobXML xmlns="http://host.adp.com\"><JobsXML><ID>1</ID><Name>Dave</Name><Age>23</Age><JobTitle>Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>2</ID><Name>John</Name><Age>44</Age><JobTitle>QA</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>3</ID><Name>Dave</Name><Age>23</Age><JobTitle>Senior Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML></JobXML>
Другие вопросы по тегам