2012-04-18 88 views
0

解決Microsoft Translator(Windows Azure)的翻譯文本時出現問題。我遵循here的示例,但是,當我嘗試在VS XAML文本框中顯示翻譯後的文本時,輸出爲:System.Data.Services.Client.QueryOperationResponse`1 [Microsoft.Translation]。Microsoft Translator XML解析

提交的查詢是正確的,但是當我在瀏覽器中鍵入它時,它不會在屏幕上返回翻譯(它只顯示文本「翻譯」和提交的時間),但頁面源提供了一個XML文檔,並在Text標記內正確翻譯。

這是我的C#代碼:

var serviceRootUri = new Uri("https://api.datamarket.azure.com/Bing/MicrosoftTranslator/"); 
var accountKey = "correct account key"; 
TranslatorContainer tc = new TranslatorContainer(serviceRootUri); 
tc.Credentials = new NetworkCredential(accountKey, accountKey); 

var translationQuery = tc.Translate(NameInput.Text, "en", "es"); 
textBox1.Text = translationQuery.Execute().ToString(); 

該頁面的源代碼(XML輸出):

> <feed xmlns:base="https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/Translate" 
> xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
> xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
> xmlns="http://www.w3.org/2005/Atom"> 
> <title type="text" /> 
> <subtitle type="text">Microsoft Translator</subtitle> 
> <id>https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/Translate?Text='Mundo'&amp;To='en'&amp;From='es'&amp;$top=100</id> 
> <rights type="text" /> 
> <updated>2012-04-18T10:02:42Z</updated> 
> <link rel="self" href="https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/Translate?Text='Mundo'&amp;To='en'&amp;From='es'&amp;$top=100"/> 
> <entry> 
> <id>https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/Translate?Text='Mundo'&amp;To='en'&amp;From='es'&amp;$skip=0&amp;$top=1</id> 
> <title type="text">Translation</title> 
> <updated>2012-04-18T10:02:42Z</updated> 
> <link rel="self" href="https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/Translate?Text='Mundo'&amp;To='en'&amp;From='es'&amp;$skip=0&amp;$top=1"/> 
> <content type="application/xml"> 
> <m:properties> <d:Text m:type="Edm.String">World</d:Text> </m:properties> 
> </content> 
> </entry> 
> </feed> 

我試圖提取XML翻譯文本,下面從hereherehere適應代碼,以及Linq,但它不會讀取未保存的文件。使用不贊成的Bing翻譯器,我設法使用XElement.Parse(translatedText).Value命令獲得解析文本,該命令現在不起作用。有沒有辦法從這個文檔讀取(從頁面源解析),或者任何其他方式來獲取翻譯文本?

回答

0

你在那裏得到的輸出看起來像一個feed。 .NET框架已經有了一個類,允許您輕鬆使用提要,即SyndicationFeed類。在你自己構建一個解析器之前,我建議你看看這個類,看它是否已經符合你的需求。

資源:http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx

更新:實例解析使用SyndicationFeed

 var settings = new XmlWriterSettings 
     { 
      Indent = true, 
      IndentChars = " ", 
      OmitXmlDeclaration = true, 
      Encoding = new UTF8Encoding(false), 
     }; 

     using (var textReader = new StringReader(<YOUR STRING HERE>)) 
     { 
      var xmlReader = XmlReader.Create(textReader); 
      var feed = SyndicationFeed.Load(xmlReader); 

      foreach (var item in feed.Items) 
      { 
       using (var tempStream = new MemoryStream()) 
       { 
        using (var tempWriter = XmlWriter.Create(tempStream, settings)) 
        { 
         item.Content.WriteTo(tempWriter, "Content", ""); 
         tempWriter.Flush(); 

         // Get the content as XML. 
         var contentXml = Encoding.UTF8.GetString(tempStream.ToArray()); 
         var contentDocument = XDocument.Parse(contentXml); 

         // Find the properties element. 
         var propertiesName = XName.Get("properties", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); 
         var propertiesElement = contentDocument.Descendants(propertiesName) 
                   .FirstOrDefault(); 

         // Find all text elements. 
         var textName = XName.Get("Text", "http://schemas.microsoft.com/ado/2007/08/dataservices"); 
         var textElements = propertiesElement.Descendants(textName); 

         foreach (var textElement in textElements) 
         { 
          Console.WriteLine("Translated word: {0}", textElement.Value); 
         } 
        } 
       } 
      } 
     } 
+0

是XML輸出,我看到這個類從另一個類似的帖子[鏈接](HTTP://計算器。 com/a/10205554/1340960),但我不確定如何使用它? – dzookatz 2012-04-18 14:50:21

+0

是的,按照這個答案:http://stackoverflow.com/questions/2686533/is-there-a-way-to-create-a-syndicationfeed-from-a-string一旦你有SyndicationFeed,你可以開始迭代通過項目。 – 2012-04-18 14:56:53

+0

對不起,對於後期的帖子,我嘗試使用「SyndicationFeed」以及[link](http://stackoverflow.com/questions/2686533/is-there-a-way-to-create來自一個字符串的聯合採購)以及一些更多的鏈接。嘗試與此變化:'TextReader tr = new StringReader(results); XmlReader xmlReader = XmlReader.Create(tr); SyndicationFeed feed = SyndicationFeed.Load(xmlReader); NameInput.Text = feed.ToString();',但無濟於事。感謝您的幫助,雖然:) '' – dzookatz 2012-04-19 12:59:35