以前操作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的更多相关文章

  1. 带名称空间的xml数据查询

    <gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.5" versio ...

  2. day 22 面向对象 类与对象 名称空间操作

    一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...

  3. IoC容器-Bean管理XML方式(p名称空间注入)

    5,p名称空间注入(简化xml配置) (1)使用p名称空间注入,可以简化基于xml配置方式 (了解实际用不多) 第一步 添加 p 名称空间在配置文件中   第二步 进行属性注入,在bean标签里面进行 ...

  4. Spring第二篇和第三篇的补充【JavaConfig配置、c名称空间、装载集合、JavaConfig与XML组合】

    前言 在写完Spring第二和第三篇后,去读了Spring In Action这本书-发现有知识点要补充,知识点跨越了第二和第三篇,因此专门再开一篇博文来写- 通过java代码配置bean 由于Spr ...

  5. XML系列之--Linq操作带属性的XML(四)

    关于XML,之前解析过电文收发方面的,就是所谓的带表头.前缀(命名空间)SOAP格式.这次需求是解析一个xml的模板(xls内容),然后填充数据,最后保存.需要时可转换xls.pdf等文件.关于这种带 ...

  6. Spring根据XML配置文件 p名称空间注入属性(property后出现,简便但只针对基本数据类型管用,自定义集合等引用类型无效)

    要生成对象并通过名称空间注入属性的类 代码如下: package com.swift; public class User { private String userName; public void ...

  7. 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)

    一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...

  8. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  9. Python--高阶函数、函数嵌套、名称空间及变量作用域、闭包、装饰器

    1.高阶函数(map/reduce/filter) 高阶函数是指函数的参数可以是函数 这篇总结几个常用的高阶函数:map/reduce/filter map函数.reduce函数.filter函数都是 ...

随机推荐

  1. QT的基本数据类型

    QT的基本数据类型(转) qint8:signed char 有符号8比特数据 qint16:signed short 16位数据类型 qint32:signed int. 32位有符号数据类型 qi ...

  2. MarkDown初学者使用指南

    换MarkDown编辑器了,突然发现自己不会,尴尬!所以顺便总结下Markdown的常用语法 标题 一级标题(格式:#+XXXXX) 二级标题(格式:##+XXXXXX) 三级标题(格式:###+XX ...

  3. HDU 5703

    题意:给你一个数n,问将n分为正整数和的方案数.如n=3共四种,1 1 1 , 1 2 , 2 1 ,3 . 思路:隔板法,n个1,有n-1个空位,每个空位可以选择是否插入隔板,插入k(0<=k ...

  4. iOS日常学习 - iOS10上关于NSPhotoLibraryUsageDescription等问题

    最近升级了Xcode8.0,真是很多坑啊,填完一个来另外一个,今天又遇到了一个,用Xcode8.0上传项目时被驳回说是info.plist里面没有设置NSPhotoLibraryUsageDescri ...

  5. GIT生成 SSH Key步骤

    //设置user.name和email 提交到git之后会显示用户名(在随意一个目录打开git-bash执行就行)Administrator@DESKTOP-BP3H0HS MINGW64 /d/mi ...

  6. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  7. web.xml上监听器作用

    <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframewor ...

  8. Java多线程 - 线程同步

    多线程操作同一个对象时,容易引发线程安全问题.为了解决线程安全问题,Java多线程引入了同步监视器. 同步代码块 同步代码块语法格式如下: synchronized(obj){ //此处的代码即为同步 ...

  9. JNI_Z_08_创建Java对象

    1.步骤 : (1).获取 jclass (2).获取 构造函数的 method id (方法的名称始终为"<init>") (3).创建Java对象的两种方式: (3 ...

  10. js中的数组对象中的方法解析

    concat()方法:  合并两个数组,返回新对象的结果: join()方法 :  把数组内的所有元素加入到一个字符串中,传入的分隔符就是指定的分隔符 pop()方法: 删除数组并返回数组的最后一个元 ...