還是在語音識別這塊。在讀取本地的SRGS的XML后,無法獲取到根節點<grammar>。
下面是SRGS.XML文件(只給出了根節點)
<?xml version="1.0" encoding="utf-8" ?> < grammar version="1.0" xml:lang="zh-cn" root="mediaMenu" tag-format="semantics/1.0" xmlns="http://www.w3.org/2001/06/grammar" xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions"> < grammar/>
對於這個通過以下解析方式,
StorageFile xmlFile = await StorageFile.GetFileFromApplicationUriAsync (new Uri("ms-appx:///SRGSGrammar.xml"));//獲取本地文件 string xmlString = await FileIO.ReadTextAsync(xmlFile); XDocument xml = XDocument.Parse(xmlString);
XElement root = xml.Element("grammar");//獲取grammar節點
獲取不到根節點grammar, root值為null
而將xmlns="http://www.w3.org/2001/06/grammar“
改為xmlns:a="http://www.w3.org/2001/06/grammar"
則能夠獲取到,這是本身的沒有:a的格式才對語音識別需要的正確格式。
這是因為標准的SRGS中,默認的namespace 是 http://www.w3.org/2001/06/grammar, 我們在定位元素時,是需要指定XNamespace的:
XDocument xml = XDocument.Parse(xmlString);
XNamespace nsSRGSG = "http://www.w3.org/2001/06/grammar"; XElement root = xml.Element(nsSRGSG + "grammar");//獲取grammar節點
通過上述就能獲取到了。
詳見MSDN文檔:
#XNamespace Class http://msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace(v=vs.110).aspx