У меня есть этот 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>
Без других вещей из приведенного ниже примера? Потому что, когда я пытаюсь получить объект строки результата, показанный ниже, он не работает.
Код, который я пытаюсь использовать, это:
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;
}
}
Вы видите исключение из-за пространства имен сериализации 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);