C#操作XML(带命名空间)
之前文章讲述了使用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(带命名空间)的更多相关文章
- Linq to Xml读取复杂xml(带命名空间)
前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...
- 由“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 ...
- Linq解析带命名空间、前缀、Soap格式的XML
关于XML,经常会用到,XML有一般的,同样也有二般的,更不要觉得会操作基础的XML就觉得自己已经精通XML操作,文中是对解析XML的方法进行介绍 1. 一般XML <?xml version= ...
- 带命名空间的XML的dom4j应用<转>
Element root = document.getRootElement(); List recordenvlist = document.selectNodes("//gm ...
- C#读取带命名空间的xml,xaml文件的解决方案
使用C#读取xml文件有三种常用的方式: 1.xmlDocument 2.XmlTextReader 3.Linq To Xml 但是这些方式在读写有些带命名空间的xml时就不知道怎么办了(例如把xa ...
- dom4j解析带命名空间的xml文件
文件内容如下 <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=& ...
- 实现动态的XML文件读写操作(依然带干货)
前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义好XML文件的格式就不太现实了,如何实现不管 ...
- VBA中操作XML
OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现. 先学习一下VBA中操作XML的方法 先引用Microsoft XML ...
- SQL Server 操作XML数据
.xml.exist 输入为XQuery表达式,返回0,1或是Null.0表示不存在,1表示存在,Null表示输入为空 .xml.value 输入为XQuery表达式,返回一个SQL Server标量 ...
随机推荐
- 新工程软连接到原来的工程的out目录后,可以直接编译模块
P508B_App_old_developer/alps$ ln -s ../../P508B_App/alps/out 连接后,第一次编译后要加分支 ./mk hedy89_we_jb2 mm p ...
- C#反射实例化类并调用类的方法
反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力. 它允许程序创建和控制任何类的对象,无需提前硬编码目标类: SalBLL a = (SalBLL)Assembly.Load("B ...
- Leetcode226:Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** * Definition for a ...
- HDU1002大数加法
大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...
- hdoj 5335 Walk Out
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5335 #include<stdio.h> #include<cstring> ...
- git 安装与使用场景
1. 安装 yum install git #自动安装依赖 centos sudo apt-get install git #ubutu http://msysgit.github.io/ #wind ...
- JavaScript设计模式 -- 读书笔记
JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...
- 全代码实现ios-1
第一次接触ios开发时,就决定用代码开发,而不用ib.因为被ib的各种控件的联线弄得一头雾水,而且ib和storyboard变动太快了. 开始的时候真是麻烦,因为网上关于全代码开发的例子太少了,大多数 ...
- Object Pascal对象模型中构造函数之研究
http://www.delphi2007.net/delphiblog/html/delphi_2004511950333715.html 前言 近期,一直在使用 C++ 与 Object Pasc ...
- C166 Interfacing C to Assembler
Interfacing C to Assembler You can easily interface your C programs to routines written in XC16x/C16 ...