AlwzLearning Ответов: 1

Проблема пространства имен Xml с использованием httpclient при десериализации


У меня есть api, который возвращает результат:


<envelope:envelope xmlns:envelope="http://xxx.com/data-hub/envelope">
<envelope:header>
<additionalInfo>
<Rebates/>
<Expenses>930879969</Expenses>
<Months>20</Months>
</additionalInfo>
</envelope:header>
</envelope>


Я получаю проблему :

Ошибка в строке 1 позиция 76. Ожидание элемента "конверт" из пространства имен 'http://schemas.datacontract.org/2004/07/'
.. Встреченный "элемент" с именем "конверт", пространство имен "http://xxx.com/data-hub/envelope".

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

using (HttpClient client = new HttpClient())
{
    var responseTask = await client.GetAsync(uri);
    responseTask.Wait();

    var result = responseTask.Result;
    if (result.IsSuccessStatusCode)
    {
        var readTask = result.Content.ReadAsAsync<t>();
        readTask.Wait();
        response = readTask.Result;
    }


Я получаю ошибку в ReadAsynch< t>

Класс T, который я посылаю, это:

[XmlRoot(ElementName = "envelope", Namespace = "http://xxx.com/data-hub/envelope")]
public class Envelope
{
    [XmlElement(ElementName = "header", Namespace = "http://xxx.com/data-hub/envelope")]
    public Header Header { get; set; }

    [XmlAttribute(AttributeName = "envelope", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string _envelope { get; set; }
}




public class Header
{
    [XmlElement(ElementName = "additionalInfo")]
    public AdditionalInfo AdditionalInfo { get; set; }
}



public class AdditionalInfo
{
    [XmlElement(ElementName = "Rebates")]
    public string Rebates { get; set; }
    [XmlElement(ElementName = "Expenses")]
    public string Expenses { get; set; }
    [XmlElement(ElementName = "Months")]
    public string Months{ get; set; }
}

PIEBALDconsult

Выглядит непоследовательно.
Не должна ли последняя строка XML быть < / envelope:envelope>?
А в вашем коде почему [XmlAttribute(AttributeName = "envelope", Namespace = "http://www.w3.org/2000/xmlns/")] ?
Я обнаружил, что с пространствами имен XML трудно работать, и особенно если вы связываетесь с пространством имен по умолчанию/пустым пространством имен, поэтому я рекомендую не использовать его.

Graeme_Grant

"Я обнаружил, что с пространствами имен XML трудно работать"... неужели? Тогда вам не понравится программирование на XAML?

PIEBALDconsult

Что меня в любом случае не интересует.

Graeme_Grant

WPF, UWP, Xamarin Forms XAML очень гибкий и мощный инструмент для проектирования пользовательского интерфейса... и особенно для привязки данных по сравнению с приложениями Winform.

PIEBALDconsult

Я не занимаюсь дизайном пользовательского интерфейса (меня просили этого не делать), а привязка данных-это для неженок.

Graeme_Grant

Ржунимагу!

1 Ответов

Рейтинг:
0

Graeme_Grant

Как упоминает PIEBALDconsult, в вашем XML есть по крайней мере одна ошибка с закрывающим тегом:

<envelope:envelope xmlns:envelope="http://xxx.com/data-hub/envelope">
	<envelope:header>
		<additionalInfo>
			<Rebates/>
			<Expenses>930879969</Expenses>
			<Months>20</Months>
		</additionalInfo>
	</envelope:header>
</envelope:envelope>

Кроме того, вы используете смешанные пространства имен. Есть два решения:

1. добавьте дополнительное определение пространства имен к открывающему элементу:
<envelope:envelope xmlns:envelope="http://xxx.com/data-hub/envelope" 

                   xmlns="http://xxx.com/data-hub/envelope">
	<envelope:header>
		<additionalInfo>
			<Rebates/>
			<Expenses>930879969</Expenses>
			<Months>20</Months>
		</additionalInfo>
	</envelope:header>
</envelope:envelope>

2. Все элементы имеют одно и то же пространство имен:
<envelope:envelope xmlns:envelope="http://xxx.com/data-hub/envelope">
	<envelope:header>
		<envelope:additionalInfo>
			<envelope:Rebates/>
			<envelope:Expenses>930879969</envelope:Expenses>
			<envelope:Months>20</envelope:Months>
		</envelope:additionalInfo>
	</envelope:header>
</envelope:envelope>

Наконец, Envelope класс должен быть:
[XmlRoot(ElementName = "envelope", Namespace = "http://xxx.com/data-hub/envelope")]
public class Envelope
{
    [XmlElement(ElementName = "header")]
    public Header Header { get; set; }
}

А вот и другие классы, используемые для тестирования, для консистенции:
public class Header
{
	[XmlElement(ElementName = "additionalInfo")]
	public AdditionalInfo AdditionalInfo { get; set; }
}

public class AdditionalInfo
{
	[XmlElement(ElementName = "Rebates")]
	public string Rebates { get; set; }
	[XmlElement(ElementName = "Expenses")]
	public string Expenses { get; set; }
	[XmlElement(ElementName = "Months")]
	public string Months { get; set; }
}