写一个小测试,通过界面文本输入框的值修改xml文件的节点值
因为刚接触xml。所以一开始就碰到了很多问题。所以在此记录下来。
1。在加载xml文档的时候就遇到一个问题,关于xml文件的路径问题。
方法:string str=Server.MaPath(".");获取web物理路径目录
string path=str+//**.xml;
这时候路径就对了。。
XmlDocument xmlDoc=new XmlDocument();
xmlDoc.Load(path);
看到了吧,上面我有用红色标注了Load(),为什么我会标记呢?因为他就是我第二个问题所在。
2。提示错误:
根级别上的数据无效。 行 1,位置 1。
看到这个错误我感觉很纳闷,也觉得这路径没有错误啊 。。网上搜资料才知道。XmlDocument xmlDOc对象有两个加载方法。第一个是Load()还有一个是LoadXml().而我正好用的是LoadXml()。。这两个方法是有不同的。。Load() 是加载xml文件。而LoadXml()则是加载Xml文档,是加载xml字符串。。。现在应该就清楚了吧。。。下次再也不会犯这样的低级错误了。呵!
3。第三个问题才是重点。错误内容是:未将对象引用设置到对象的实例
同样挺郁闷的。读取xml文件怎么也报这样的错误了啊。。没理由啊。。爬山涉水终于找到了答案。
参考:http://hi.baidu.com/kylinjack/blog/item/9cdb38faf559552a4f4aea1e.html
原来是定义xml文件的时候,加入了xmlns表示命名空间,同样呢,XPath也需要加入命名空间
请看代码:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<report>
<dataSource>
....
</dataSource>
<ReportItems>
.......
</ReportItems>
</report>
如果我们的xml文件时上面这样的格式的话。那么查找xml文件中的xml节点则只需要这样写就可以 了。
xmlDoc.Load(path);
string xpath=@"report/ReportItems";
XmlNodeList xmlList=xmlDoc.SelectSingleNode(xpath).ChildNodes;
这样就获取了ReportItems下面的节点,然后进行匹配操作就可以了。
可问题是现在的xml文件不是这样,而是加入了xmlns命名空间
如:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<DataSources>
....
</dataSource>
<ReportItems>
.......
</ReportItems>
</Report >
所以现在查找节点就需要这样来写了:
xmlDoc.Load(path);
XmlNamespaceManager xnm = new XmlNamespaceManager(xmldoc.NameTable);
xnm.AddNamespace("mxh", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
string xPath = @"/mxh:Report/mxh:ReportItems";
XmlNodeList xmllist = xmldoc.SelectSingleNode(xPath, xnm).ChildNodes;
好了,这样就不会报错了,下面就可以继续操作了。循环xmllist,然后匹配节点。。