C#操作带名称空间的xml
以前操作xml一般用下面这种方式:
好处是XDocument 能使用linq
- xmlPath = “path”;
- XDocument myXDoc = XDocument.Load(xmlPath);
- IEnumerable<XElement> targetNodes = from target in myXDoc.Descendants("signal")
- where target.Attribute("signalname").Value == name
- select target;
- XElement element = targetNodes.First();
这种只方式遇到带名称空间的就坑了,看来参考中的两篇博客,发现以下方法可以操作
- StreamReader reader=new StreamReader("path");
XmlReader reader = XmlReader.Create(respStream);- XElement root = XElement.Load(reader);
- XmlNameTable nameTable = reader.NameTable;
- XmlNamespaceManager namespaceManager = new XmlNamespaceManager(nameTable);
- namespaceManager.AddNamespace("wfs", "http://www.opengis.net/wfs");
- namespaceManager.AddNamespace("ows", "http://www.opengis.net/ows");
- namespaceManager.AddNamespace("ocg", "http://www.opengis.net/ocg");
- namespaceManager.AddNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
- namespaceManager.AddNamespace("gml", "http://www.opengis.net/gml");
- namespaceManager.AddNamespace("ogc", "http://www.opengis.net/ogc");
- namespaceManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
- namespaceManager.AddNamespace("myWorld","http://www.myWorld.com");
- XElement child1 = root.XPathSelectElement("./wfs:FeatureTypeList", namespaceManager);
- XElement child2 = child1.XPathSelectElement("./wfs:FeatureType", namespaceManager);//这里是重点,child2既然是child1的子节点,就必须调用child1的XPathSelectElement方法
上面的方法中也看到了,如果child2是child1的子节点,就必须调用child1的XPathSelectElement方法,这样如果想取一个纵深很深的XElement,是不是要手动一个个的找到其Parent节点,再用上面的办法写一堆。。。
- child.XPathSelectElement()
- 想起了WPF中查找XMAL中指定节点的方法,于是我使用递归写了下面的办法来获取子节点。
调用GetNode,传入的参数是前一段代码的,最后xElementList 中得到的就是需要获取的XElement的集合。
- 如果使用注释中的代码,返回的是xml文档中的第一个检索到的XElement。
- List<XElement> xElementList = new List<XElement>();
/// <summary>
/// 获取子节点(不完善,根加点的第一级子节点无法获取,有需要的话需单独调用一次XElement elelment = root.XPathSelectElement(nodePath, xmlNameSpaceManager);)
/// </summary>
/// <param name="root">根节点</param>
/// <param name="xmlNameSpaceManager">命名空间管理器(我自己这么叫它)</param>
/// <param name="nodeSpace">需获取的节点的命名空间</param>
/// <param name="nodeName">需获取的节点的名称,如<ows:DCP>,ows是名称空间,DCP是其名字</param>
/// <returns></returns>
- private XElement GetNode(XElement root,XmlNamespaceManager xmlNameSpaceManager,string nodeSpace,string nodeName)
- {
- List<XElement> childList = root.Elements().ToList();
- for (int i = ; i < childList.Count; i++)
- {
- XElement child = childList[i];
- var node = GetElement(child, xmlNameSpaceManager, nodeSpace, nodeName);
- if (node != null)
- {
- xElementList.Add(node);
- //return node;
- }
- else
- {
- node = GetNode(child, xmlNameSpaceManager, nodeSpace, nodeName);
- if (node != null)
- xElementList.Add(node);
- //return node;
- }
- }
- return xElementList;
- //return node;
- }
- private XElement GetElement(XElement root, XmlNamespaceManager xmlNameSpaceManager, string nodeSpace, string nodeName)
- {
- var enumerator = xmlNameSpaceManager.GetEnumerator();
- while (enumerator.MoveNext())
- {
- var nameSpace = enumerator.Current.ToString();
- if (nameSpace.Equals(nodeSpace))
- {
- string nodePath = "./" + nameSpace + ":" + nodeName;
- XElement elelment = root.XPathSelectElement(nodePath, xmlNameSpaceManager);
- if (elelment != null)
- return elelment;
- }
- }
- return null;
- }
参考:
http://www.cnblogs.com/HQFZ/p/4788428.html
http://www.cnblogs.com/landeanfen/p/4636102.html
C#操作带名称空间的xml的更多相关文章
- 带名称空间的xml数据查询
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.5" versio ...
- day 22 面向对象 类与对象 名称空间操作
一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...
- IoC容器-Bean管理XML方式(p名称空间注入)
5,p名称空间注入(简化xml配置) (1)使用p名称空间注入,可以简化基于xml配置方式 (了解实际用不多) 第一步 添加 p 名称空间在配置文件中 第二步 进行属性注入,在bean标签里面进行 ...
- Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】
前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...
- XML系列之--Linq操作带属性的XML(四)
关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...
- Spring根据XML配置文件 p名称空间注入属性(property后出现,简便但只针对基本数据类型管用,自定义集合等引用类型无效)
要生成对象并通过名称空间注入属性的类 代码如下: package com.swift; public class User { private String userName; public void ...
- 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)
一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...
- Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器
今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...
- Python--高阶函数、函数嵌套、名称空间及变量作用域、闭包、装饰器
1.高阶函数(map/reduce/filter) 高阶函数是指函数的参数可以是函数 这篇总结几个常用的高阶函数:map/reduce/filter map函数.reduce函数.filter函数都是 ...
随机推荐
- CF335B
/*CF335B 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 否则执行 ...
- Linux关于yum命令Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
Linux关于yum命令Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx. 问题: Linux ...
- Number使用笔记
Numbe函数用于将对象转换为数字 0 0 null 0 空 0 "" 0 true 1 false 0 date ...
- Metasploit 内网渗透篇
0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...
- linux 挂在新硬盘
记录一下 全忘了..... PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来,才能让硬盘使用.把硬盘装好后,我们用 fdisk -l 查看下: 图中可以看出 /dev/ ...
- JavaEE之Junit单元测试
1编写测试类,简单理解Junit可以部分用于取代java的main方法 2在测试类方法上添加注解 @Test 3 @Test修饰的方法要求:public void 方法名() {…} ,方法名自定义建 ...
- 堆与堆排序、Top k 问题
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满 ...
- 死循环的/etc/profile
用户服务器登陆后停在以下界面 Connecting to ... Connection established. To escape to local shell, press 'Ctrl+Alt+] ...
- 通过HBase API进行开发
http://www.cnblogs.com/netbloomy/p/6683509.html 一.将HBase的jar包及hbase-site.xml添加到IDE 1.到安装HBase集群的任意一台 ...
- 运行jar_测试代码
1.Eclipse 将 工程 导出成 jar Eclipse --> Export... --> 界面中树状图形中选择" Java下的'JAR file' "(不知道这 ...