DataContract десериализовать XML

1

У меня есть этот XML:

<ResultData xmlns="http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Information>Schedule added.</Information>
  <Success>true</Success>
</ResultData>

Есть ли способ получить только результат:

<ResultData>
  <Information>Sched added.</Information>
  <Success>true</Success>
</ResultData>

Без других вещей из приведенного ниже примера? Потому что, когда я пытаюсь получить объект строки результата, показанный ниже, он не работает.

Datacontract Сериализация XML

Код, который я пытаюсь использовать, это:

var serializer = new XmlSerializer(typeof(ResultData)); 
var rdr = new StringReader(xmlResultString);
var resultingMessage = (ResultData)serializer.Deserialize(rdr);

И в последней строке это показывает мне ошибку:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.dll

Additional information: There is an error in XML document (1, 2).

<ResultData xmlns='http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities'> was not expected.

ResultData:

[DataContract]
public class ResultData
{

    [DataMember] 
    public bool Success
    {
        get;
        set;
    }

    [DataMember] 
    public string Information
    {
        get;
        set;
    }

}
  • 0
    Покажите свой код и определите «не работает», в противном случае вы, скорее всего, не получите помощи. Мы не ясновидящие ....
  • 0
    Я отредактировал свой вопрос. Благодарю.
Показать ещё 2 комментария
Теги:
wcf
datacontractserializer
xml-deserialization

1 ответ

1
Лучший ответ

Вы видите исключение из-за пространства имен сериализации DataContract в xml. В идеале вы хотите десериализовать это с помощью DataContractSerializer.

Если вы хотите использовать XmlSerializer, вам придется очистить декларацию пространства имен. После этого будет очищено все пространство имен и разрешено использовать XmlSerializer. В цикле foreach нам нужно удалить атрибут IsNamespaceDeclaration, а затем установить свойство Name Name в LocalName.

string xmlResultString = @"<ResultData xmlns=""http://schemas.datacontract.org/2004/07/TsmApi.Logic.BusinesEntities"" 
xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"">
<Information>Schedule added.</Information>
<Success>true</Success>
</ResultData>";

var doc = XDocument.Parse(xmlResultString);

foreach (var element in doc.Descendants())
{
    element.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
    element.Name = element.Name.LocalName;
}
xmlResultString = doc.ToString();
var rdr = new StringReader(xmlResultString);
var serializer = new XmlSerializer(typeof(ResultData));
var resultingMessage = (ResultData)serializer.Deserialize(rdr);
  • 0
    Спасибо вам большое! Это лучший способ сделать это из всего, что я пробовал. :)
  • 0
    Я использовал именно ваш код, и он работал отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню