最近做了一个小工具,功能就是对指定的xml文件进行简单的操作,假如这是要被操作的xml文件
......
发现用以下代码无法读取xml文件
XmlNodeList nodes = xmlDoc.SelectNodes("/ConfigEntities/ServiceInstance");
在网上查了很多才知道原来对于具有命名空间的xml文件用以上方法读取无效,要这样读才能读取
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);//声明一个命名空间管理器 nsmgr.AddNamespace("ns", "http://itlogica.com/ServiceConfigurationSchema.xsd");//向管理器添加一个命名空间连接,其中ns为添加命名空间的名称,"http://itlogica.com/ServiceConfigurationSchema.xsd"为xml文件命名空间。两个参数都是string类型。 XmlNodeList nodes =xmlDoc.SelectNodes("/ns:ConfigEntities/ns:ServiceInstance", nsmgr);
但是在写往xml文件中添加节点时,又遇到了一个问题
XmlNode node = xmlDoc.SelectSingleNode("/ns:ConfigEntities", nsmgr);/使用命名空间查找节点。注意其中的ns和nsmgr XmlNode nodes = xmlDoc.CreateElement("ServiceInstance");
我按一上方式操作向xml文件添加节点时总会生成一个默认的属性 “xmls="" “,就像如下所示
经过查找才知道原来是这样的:
在xml文件具有命名空间时,你的xml各种类型中的元素在没有确切指明其命名空间的情况下,它的命名空间就是默认命名空间(一般问xml文档根节点中指定命名空间的第一个属性)。当你添加节点时,若没有指明该节点的命名空间时,不会使用默认命名空间的,会添加:xmls=“”,作为默认命名空间。
所以,解决的方式当然就是在添加节点时就指明其命名空间所以正确的做法是:
在创建要加入的节点时指明一个xmlUrl就可以啦:
XmlElement jobElement = xmlDoc.CreateElement("job", xmlUrl);
xmlUrl就是上文假定要操作的xml文件的命名空间。
解决了以上问题,我的小工具也做好了,碰到问题和大家分享一下解决的办法。写这篇的目的就是那么简单,谢谢大家赏脸并不吝赐教一二!