C#读取xml 文件 报错:未将对象引用设置到对象的实例

 写一个小测试,通过界面文本输入框的值修改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,然后匹配节点。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值