以前操作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. C# 字符串中正则表达式的应用

    1.截取字符串中指定内容 {"weatherinfo":{"city":"北京","cityid":"1010 ...

  2. HTML5/CSS3图片左右切换弹性动画

    在线演示 本地下载

  3. 20145217《信网络对抗》逆向与BOF基础实践

    20145217<信网络对抗>逆向与BOF基础实践 内容: 一.简单机器指令,汇编语言 1.'objdump -d xxx|more'反汇编命令查看机器代码,'cat'显示文件内容,'xx ...

  4. spring security采用自定义登录页和退出功能

    更新... 首先采用的是XML配置方式,请先查看  初识Spring security-添加security 在之前的示例中进行代码修改 项目结构如下: 一.修改spring-security.xml ...

  5. 简单的aop实现日志打印(切入点表达式)

    Spring中可以使用注解或XML文件配置的方式实现AOP. 1.导入jar包 com.springsource.net.sf.cglib -2.2.0.jar com.springsource.or ...

  6. java中TreeMap集合的常用方法

    实现Map集合的方法这里就不在讲了 https://www.cnblogs.com/xiaostudy/p/9510763.html public Map.Entry<K,V> ceili ...

  7. PAT1051. Pop Sequence (25)

    #include <iostream> #include <stack> using namespace std; int sizeMax,n,k; stack<int& ...

  8. C语言,C#,Java,JavaScript之强类型与弱类型

    奇葩的我今天想到一个坑爹的问题,都说Java是强类型的语言,JavaScript是弱类型的语言. 嗯嗯,那初学时候的C语言呢? 呵呵哒,突然觉得短路了.说Java是强类型的语言是因为遇到这样的情况: ...

  9. Java Swing窗体小工具实例 - 原创

    Java Swing窗体小工具实例 1.本地webserice发布,代码如下: 1.1 JdkWebService.java package server; import java.net.InetA ...

  10. rhel yum报错

    用yum报错 http://mirrors.aliyun.com/centos/%24releasever/addons/x86_64/repodata/repomd.xml: [Errno 12] ...