Как десериализовать ответ XML, когда корневой узел является строкой в ​​C#

Microsoft Cognitive Text Translator API дает ответ в следующем формате:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">nl</string>

Я пытался десериализовать его с помощью следующего кода:

var serializer = new XmlSerializer(typeof(string));
var stringReader = new StringReader(xmlResult); // xmlResult is the xml string above
var textReader = new XmlTextReader(stringReader);
var result = serializer.Deserialize(textReader) as string;

Но это приведет к исключению:

System.InvalidOperationException: в XML-документе произошла ошибка (1, 23). ---> System.InvalidOperationException: http://schemas.microsoft.com/2003/10/Serialization/'> не ожидалось.

Я думал об обертывании ответа API XML в другом корневом узле, чтобы я мог разобрать его для объекта. Но должен быть лучший способ решить это.

Я ценю вашу помощь в решении моей проблемы.

2 ответа

Решение

Microsoft Cognitive Text Translator API дает ответ в следующем формате

Учитывая, что это всегда допустимый фрагмент XML с одним строковым узлом, вы можете смело использовать

var result = XElement.Parse(xmlResult).Value;

При разборе строки XML с XElement.Parse, вам не нужно заботиться о пространстве имен.

У вас есть проблема с пространством имен. Если вы сериализовали значение с помощью этого сериализатора, вы получите:

<string>nl</string>

Так что установите пространство имен по умолчанию на одно в вашем XML:

var serializer = new XmlSerializer(typeof(string),
     "http://schemas.microsoft.com/2003/10/Serialization/");

И используйте это:

using (var reader = new StringReader(xmlResult))
{
    var result = (string)serializer.Deserialize(reader);
}

Смотрите эту скрипку для рабочего демо.

Другие вопросы по тегам