2016-11-09 63 views
1

微软认知文本翻译API给出如下格式的响应:如何反序列化XML响应时根节点是在C#中的字符串

<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,所以我可以解析它到一个对象。但是必须有更好的方法来解决这个问题。

我很感谢您的帮助,以解决我的问题。

+0

你想从字符串中获得'nl'吗? –

+0

@WiktorStribiżew是的,只是'nl'部分 –

+1

尝试'var result = XElement.Parse(xmlResult).Value;' –

回答

2

微软认知文本翻译API给出了以下格式

响应考虑它总是有一个字符串节点有效的XML片段,您可以放心的使用

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

当用XElement.Parse解析XML字符串,您不必关心名称空间。

+1

@Charles Mager的答案也是正确的,但我更喜欢这个答案,因为它是单行代码。 –

1

您遇到的问题是命名空间。如果您使用串行器序列化的值,你会得到:

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

查看this fiddle进行工作演示。

+0

我正在寻找'defaultNamespace'属性,但是Intellisense没有显示它,直到我输入了一个字符串。感谢您的解决方案:) –

相关问题