2016-11-09 12 views
1

C#で文字列があるとき、XMLレスポンスをデシリアライズする方法:ルートノードは、Microsoft認知テキスト翻訳の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 response 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内の1つのにデフォルトの名前空間を設定します。

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は文字列を入力するまで表示しませんでした。ソリューションをありがとう:) –

関連する問題