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函数都是 ...
随机推荐
- Linux中read命令的用法—(6/30)
read命令是一个非常重要的bash命令,用于从键盘或者表中输入中文本,并且可以和用户进行交互:该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开.在read命令后面,如果没有指定变量名 ...
- LigerUI v1.2.4 LigerGrid默认样式 工具条背景白色
修改Aqua的ligerui-grid.css .l-panel-topbar 样式 修改为: .l-panel-topbar{padding: 0;background: #CEDFEF url(' ...
- svn如何给新文件加锁
第一步: 右键subversion(版本控制) 第二部:找到 subversion properties 第二部: add进行添加
- 把 html标签转化为 html标签代码
HttpUtility.HtmlEncode(table.Rows[0]["footnote"].ToString());
- Spring MVC 之传递模型数据到视图中
类似于 JSP-Servlet 中的 req.setAttribute . req.getSession().setAttribute ... --> 最后在 JSP 用 EL 表达式取得这些数 ...
- APP测试的要点
APP测试要点 功能性 UI界面 安装与卸载 升级 登录测试 离线测试 安全性测试 兼容性(操作系统,屏幕尺寸,分辨率,厂家) 消息推送 前后台切换 网络环境(wifi/2G/3G/4G/无网) 异常 ...
- QT中没有byte
QT里没有没有byte数据类型的 自己定义:#define byte unsigned char
- Maven的简介
1 What? 1.1 Maven 简介Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理.Maven 这个单词的本意是:专家,内行. ...
- fix LayerKit framework不能提交App Store
- 问题: - 原因 x86_64, i386是ios模拟器用的architectures.发布时,不支持这两种.但是,默认编译出来的layerkit framework支持这两种编译器 - 解决办法 ...
- 3.scala容器
3.scala容器 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-o ...