还是在语音识别这块。在读取本地的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