C# XmlDocument SelectNodes查询metaData节点返回0问题排查
问题根因
查询不到metaData节点的核心原因是未处理
- XML中
<bodyContent>节点上声明了默认命名空间:xmlns="http://www.webex.com/schemas/2002/06/service/training",该命名空间作用域覆盖<bodyContent>本身,以及它下面所有没有显式命名空间前缀的子节点(包括<metaData>、<agenda>、<description>、<enableOptions>等)。 - 原有代码的
XmlNamespaceManager只注册了serv前缀对应的命名空间,没有注册上述training模块的默认命名空间;同时XPath查询时写的bodyContent、metaData都是无前缀写法,默认匹配无命名空间的节点,和实际节点所属命名空间不匹配,因此返回结果数为0。 securityContext节点能正常查询,是因为<header>、<securityContext>及其子节点位于<bodyContent>之外,该区域没有声明默认命名空间,无前缀节点属于无命名空间,和XPath匹配规则一致,所以能正常返回结果。
修改方案
按以下两步调整即可:
- 在命名空间管理类中注册training模块的默认命名空间,自定义前缀即可(比如用
train) - 调整XPath路径,为所有属于training命名空间的节点加上对应前缀
修改后的完整可运行代码如下:
static void Main(string[] args) { var xmlPathh = @"C:\Users\SKMEENA\Desktop\VILT.xml";// 存储VILT XML的文件路径 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPathh); // 原有securityContext查询逻辑无需改动,可正常返回结果 var node = xmlDoc.SelectNodes("/serv:message/header/securityContext/*", GetNameSpace(xmlDoc.NameTable)); // 修改后的metaData节点查询:给bodyContent、metaData加上train前缀 var member = xmlDoc.SelectNodes("/serv:message/body/train:bodyContent/train:metaData/*", GetNameSpace(xmlDoc.NameTable)); } static XmlNamespaceManager GetNameSpace(XmlNameTable objNameTable) { XmlNamespaceManager objNsManager =new XmlNamespaceManager(objNameTable); objNsManager.AddNamespace("serv", "http://www.webex.com/schemas/2002/06/service"); // 新增注册training默认命名空间,前缀自定义为train objNsManager.AddNamespace("train", "http://www.webex.com/schemas/2002/06/service/training"); // 后续如果需要单独查询sess前缀节点,可补充注册对应命名空间,当前查询metaData下所有子节点不需要 // objNsManager.AddNamespace("sess", "http://www.webex.com/schemas/2002/06/session"); objNsManager.AddNamespace("ns1", "http://www.webex.com/schemas/2002/06/service/site"); return objNsManager; }
说明:XPath末尾的
/*是通配符,可以匹配任意命名空间下的子节点,因此<metaData>下带sess前缀的<sess:confName>和无前缀的<agenda>等节点都能被正常获取,不需要额外给子节点加前缀。
附:问题涉及的标准VILT创建会话XML参考
<?xml version="1.0" encoding="utf-8"?> <serv:message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:serv="http://www.webex.com/schemas/2002/06/service" xsi:schemaLocation="http://www.webex.com/schemas/2002/06/service http://www.webex.com/schemas/2002/06/service.xsd"> <header> <securityContext> <webExID/> <password/> <siteID/> <partnerID/> </securityContext> </header> <body> <bodyContent xsi:type="java:com.webex.service.binding.training.CreateTrainingSession" xmlns="http://www.webex.com/schemas/2002/06/service/training" xmlns:com="http://www.webex.com/schemas/2002/06/common" xmlns:sess="http://www.webex.com/schemas/2002/06/session" xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.webex.com/schemas/2002/06/service/training http://www.webex.com/schemas/2002/06/service/training/trainingsession.xsd"> <sess:accessControl> <sess:sessionPassword/> </sess:accessControl> <sess:schedule></sess:schedule> <metaData> <sess:confName/> <agenda/> <description/> <greeting/> <location/> </metaData> <enableOptions> <chat/> <poll/> <audioVideo/> <fileShare/> <applicationShare/> <desktopShare/> <annotation/> <fullScreen/> <voip/> </enableOptions> </bodyContent> </body> </serv:message>
内容的提问来源于stack exchange,提问作者sunil20000
相关产品推荐
相关产品推荐

