2016-11-09 38 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沒有顯示它,直到我輸入了一個字符串。感謝您的解決方案:) –

相關問題