当根节点是c#中的字符串时,如何反序列化XML响应

本文关键字:反序列化 响应 XML 字符串 根节点 | 更新日期: 2023-09-27 18:17:00

微软认知文本翻译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;

但是这会导致一个异常:

系统。InvalidOperationException: XML文档(1,23)中有一个错误。——比;系统。InvalidOperationException: was not expected.

我正在考虑将api响应xml包装在另一个根节点中,这样我就可以将其解析为对象。但是一定有更好的方法来解决这个问题。

当根节点是c#中的字符串时,如何反序列化XML响应

微软认知文本翻译API给出了如下格式的响应

考虑到它总是具有单个字符串节点的有效XML片段,您可以安全地使用

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

使用XElement.Parse解析XML字符串时,不必关心名称空间

您的问题是名称空间。如果使用该序列化器序列化一个值,您将得到:

<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);
}