XML解析异常:C#代码获取AccessToken节点返回null求排查
问题分析与解决
问题原因
你的问题出在XML命名空间的使用错误:
- 根节点
<act:Token>使用了act命名空间,但子节点<AccessToken>未添加act前缀,说明它属于无命名空间的节点。 - 你在
SelectSingleNode中使用//act:AccessToken,是在查找act命名空间下的AccessToken节点,自然匹配不到,因此返回null。
修正后的代码
将节点选择器修改为直接匹配无命名空间的AccessToken即可,也可以使用更精确的路径定位:
HttpClient apiP21 = new(); apiP21.DefaultRequestHeaders.Add("client_secret", "thesecret"); apiP21.DefaultRequestHeaders.Add("grant_type", "client_credentials"); apiP21.DefaultRequestHeaders.Add("username", "theuser"); var tokenRequestDataContent = new StringContent("", Encoding.UTF8, "application/xml"); var tokenResponse = apiP21.PostAsync("theendpoint", tokenRequestDataContent).Result; if (!tokenResponse.IsSuccessStatusCode) { return BadRequest("Could not get Security Token"); } string tokenResponseRaw = tokenResponse.Content.ReadAsStringAsync().Result; XmlDocument tokenResponseXML = new(); tokenResponseXML.LoadXml(tokenResponseRaw); XmlNamespaceManager nsmgr = new(tokenResponseXML.NameTable); nsmgr.AddNamespace("act", "http://distributionsuite.activant.com"); // 方案1:直接匹配无命名空间的AccessToken节点 XmlNode accessTokenNode = tokenResponseXML.SelectSingleNode("//AccessToken", nsmgr)!; // 方案2:使用精确路径定位(更高效) // XmlNode accessTokenNode = tokenResponseXML.SelectSingleNode("/act:Token/AccessToken", nsmgr)!; string accessToken = accessTokenNode?.InnerText!;
补充说明:只有当节点明确带有命名空间前缀时,才需要在选择器中对应前缀;当前XML仅根节点属于act命名空间,所有子节点均为无命名空间节点,直接使用节点名称即可匹配。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

