之前文章讲述了使用c# xpath如何操作xml文件,在实际开发项目中,遇到的很多xml文件都是带有命名空间的,如果还是用之前的代码获取,那将获取到null。
本文讲解操作代码有命名空间的Xml文件,以及多个命名空间的xml。

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.52taiqiu.com">
<News count="26">
<New id="4033" date="2012-02-26">
<Title>无锡精英赛正式升级为斯诺克排名赛</Title>
<Url>http://www.52taiqiu.com/news/2012/2/4033.html</Url>
</New>
<New  id="4013" date="2012-02-20">
<Title>组图:威尔士赛丁俊晖击败塞尔比夺冠</Title>
<Url>http://www.52taiqiu.com/news/2012/2/4013.html</Url>
</New>
</News>
</Root>

如用之前代码:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"D:\news.xml");
XmlNodeList nodelist = xml.SelectNodes("//Root/News"); 
nodelist返回的值永远是null,原因是:如果XPath表达式没有加前缀(如a:b中前缀是a),那么所查询节点(注意属性也可以是节点)的命名空间URI就应该是空值(也是默认值),否则XPath不会返回结果。

现在要想获取到节点,则需要添加命名空间,具体代码如下:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"D:\news.xml");
XmlNamespaceManager xmlns = new XmlNamespaceManager(xmldoc.NameTable);
xmlns.AddNamespace("a", "http://www.52taiqiu.com");//如有多个命名空间,添加同行类似代码
XmlNodeList nodelist = xmldoc.SelectNodes("a:Root/a:News/a:New", xmlns);

如果不使用xPath来取值,使用XmlNodeList nodelist = xmldoc.GetElementsByTagName("New"); 也可以取到值。

附上完整代码:

XmlDocument xmldoc = new XmlDocument();
//加载xml文件
xmldoc.Load(@"E:\Test\Test\xx.xml");
XmlNamespaceManager xmlns = new XmlNamespaceManager(xmldoc.NameTable);
xmlns.AddNamespace("a", "http://www.52taiqiu.com");
XmlNodeList nodelist = xmldoc.SelectNodes("a:Root/a:News/a:New",xmlns);
foreach (XmlNode n in nodelist)
{
XmlElement el = (XmlElement)n;
string id = el.GetAttribute("id");
string date = el.GetAttribute("date");
string title = xmldoc.SelectSingleNode("a:Root/a:News/a:New/a:Title", xmlns).InnerText;
string url = xmldoc.SelectSingleNode("a:Root/a:News/a:New/a:Url", xmlns).InnerText;
}

C#操作XML(带命名空间)的更多相关文章

  1. Linq to Xml读取复杂xml(带命名空间)

    前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...

  2. 由“Jasperrpeorts 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作

    原文同步至:http://www.waylau.com/from-jasperrpeorts-4-1-2-upgraded-to-5-1-2-parsing-of-flex-projects-to-t ...

  3. Linq解析带命名空间、前缀、Soap格式的XML

    关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...

  4. 带命名空间的XML的dom4j应用<转>

    Element root = document.getRootElement();     List   recordenvlist = document.selectNodes("//gm ...

  5. C#读取带命名空间的xml,xaml文件的解决方案

    使用C#读取xml文件有三种常用的方式: 1.xmlDocument 2.XmlTextReader 3.Linq To Xml 但是这些方式在读写有些带命名空间的xml时就不知道怎么办了(例如把xa ...

  6. dom4j解析带命名空间的xml文件

    文件内容如下 <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=& ...

  7. 实现动态的XML文件读写操作(依然带干货)

    前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义好XML文件的格式就不太现实了,如何实现不管 ...

  8. VBA中操作XML

    OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现. 先学习一下VBA中操作XML的方法 先引用Microsoft XML ...

  9. SQL Server 操作XML数据

    .xml.exist 输入为XQuery表达式,返回0,1或是Null.0表示不存在,1表示存在,Null表示输入为空 .xml.value 输入为XQuery表达式,返回一个SQL Server标量 ...

随机推荐

  1. 如何通过Android Studio发布library到jCenter和Maven Central

    http://www.jianshu.com/p/3c63ae866e52# 在Android Studio里,如果你想引入任何library到自己的项目中,只需要很简单的在module的build. ...

  2. 第二百一十七天 how can I 坚持

    JavaScript  document.getElementByName()获取数组,for循环,搞了一天,好笨. 明天要下雪了,好冷. 双十一,天猫搞的挺特别啊,晚上抢了个小米红包,不知道买啥,哎 ...

  3. B. Rebranding

    http://codeforces.com/problemset/problem/591/B   B. Rebranding time limit per test 2 seconds memory ...

  4. 思科ASA系列防火墙配置手册

    使用console连接线登录方法 1.使用cisco的console连接线,连接设备的console口和计算机com口(笔记本用USB转COM口连接线)2.使用超级终端或secureCRT软件连接设备 ...

  5. find 命令概览

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  6. Codeforces Round #313 (Div. 2) E. Gerald and Giant Chess (Lucas + dp)

    题目链接:http://codeforces.com/contest/560/problem/E 给你一个n*m的网格,有k个坏点,问你从(1,1)到(n,m)不经过坏点有多少条路径. 先把这些坏点排 ...

  7. c++字符串机理

    在windows编程中,由于编码方式的不同和c与c++的不同而造成了许多复杂的有关字符串之间的转换 首先,windows编码方式有ANSCLL和UNICODE,前者是单字符的,后者是双字符的. 然后, ...

  8. Android Studio使用JNI

    0x01 前言 本文讲述使用Android Studio通过静态注册.动态注册使用JNI的方法,以及加载第三方so文件的方法 0x02 Android Studio静态注册的方式使用JNI 1. 添加 ...

  9. installshield Basic 工程每次安装完提示重启电脑

     将Sequence中的ScheduleReboot Action的Condition清空即可. 

  10. InvocationHandler

    ====================================================================== 代理类生成之后再调用目标方法时就会调用invoke方法 p ...