以前操作xml一般用下面这种方式:

好处是XDocument 能使用linq

  1.        xmlPath = path”;
  2. XDocument myXDoc = XDocument.Load(xmlPath);
  3. IEnumerable<XElement> targetNodes = from target in myXDoc.Descendants("signal")
  4. where target.Attribute("signalname").Value == name
  5. select target;
  6. XElement element = targetNodes.First();

这种只方式遇到带名称空间的就坑了,看来参考中的两篇博客,发现以下方法可以操作

  1.        StreamReader reader=new StreamReader("path");
           XmlReader reader = XmlReader.Create(respStream);
  2. XElement root = XElement.Load(reader);
  3. XmlNameTable nameTable = reader.NameTable;
  4. XmlNamespaceManager namespaceManager = new XmlNamespaceManager(nameTable);
  5. namespaceManager.AddNamespace("wfs", "http://www.opengis.net/wfs");
  6. namespaceManager.AddNamespace("ows", "http://www.opengis.net/ows");
  7. namespaceManager.AddNamespace("ocg", "http://www.opengis.net/ocg");
  8. namespaceManager.AddNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance");
  9. namespaceManager.AddNamespace("gml", "http://www.opengis.net/gml");
  10. namespaceManager.AddNamespace("ogc", "http://www.opengis.net/ogc");
  11. namespaceManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
  12. namespaceManager.AddNamespace("myWorld","http://www.myWorld.com");
  13. XElement child1 = root.XPathSelectElement("./wfs:FeatureTypeList", namespaceManager);
  14. XElement child2 = child1.XPathSelectElement("./wfs:FeatureType", namespaceManager);//这里是重点,child2既然是child1的子节点,就必须调用child1的XPathSelectElement方法

上面的方法中也看到了,如果child2是child1的子节点,就必须调用child1的XPathSelectElement方法,这样如果想取一个纵深很深的XElement,是不是要手动一个个的找到其Parent节点,再用上面的办法写一堆。。。

  1. child.XPathSelectElement()
  2.  
  3. 想起了WPF中查找XMAL中指定节点的方法,于是我使用递归写了下面的办法来获取子节点。
    调用GetNode,传入的参数是前一段代码的,最后xElementList 中得到的就是需要获取的XElement的集合。
  1. 如果使用注释中的代码,返回的是xml文档中的第一个检索到的XElement
  1. 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>

  1. private XElement GetNode(XElement root,XmlNamespaceManager xmlNameSpaceManager,string nodeSpace,string nodeName)
  2. {
  3. List<XElement> childList = root.Elements().ToList();
  4. for (int i = ; i < childList.Count; i++)
  5. {
  6. XElement child = childList[i];
  7. var node = GetElement(child, xmlNameSpaceManager, nodeSpace, nodeName);
  8. if (node != null)
  9. {
  10. xElementList.Add(node);
  11. //return node;
  12. }
  13. else
  14. {
  15. node = GetNode(child, xmlNameSpaceManager, nodeSpace, nodeName);
  16. if (node != null)
  17. xElementList.Add(node);
  18. //return node;
  19. }
  20. }
  21. return xElementList;
  1. //return node;
  1. }
  1. private XElement GetElement(XElement root, XmlNamespaceManager xmlNameSpaceManager, string nodeSpace, string nodeName)
  2. {
  3. var enumerator = xmlNameSpaceManager.GetEnumerator();
  4. while (enumerator.MoveNext())
  5. {
  6. var nameSpace = enumerator.Current.ToString();
  7. if (nameSpace.Equals(nodeSpace))
  8. {
  9. string nodePath = "./" + nameSpace + ":" + nodeName;
  10. XElement elelment = root.XPathSelectElement(nodePath, xmlNameSpaceManager);
  11. if (elelment != null)
  12. return elelment;
  13. }
  14. }
  15. return null;
  16. }
  1.  
  1.  

参考:

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. CF335B

    /*CF335B 这个题目的n达到50000,但是串只是有小写字母组成,所以如果字符串的长度大于2600,那么 肯定存在,所开始输入就判断如果长度大于2600,那么直接找当个字母输出100个 否则执行 ...

  2. 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 ...

  3. Number使用笔记

    Numbe函数用于将对象转换为数字 0          0 null       0 空  0 ""         0 true      1 false     0 date ...

  4. Metasploit 内网渗透篇

    0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...

  5. linux 挂在新硬盘

    记录一下    全忘了..... PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来,才能让硬盘使用.把硬盘装好后,我们用 fdisk -l 查看下: 图中可以看出 /dev/ ...

  6. JavaEE之Junit单元测试

    1编写测试类,简单理解Junit可以部分用于取代java的main方法 2在测试类方法上添加注解 @Test 3 @Test修饰的方法要求:public void 方法名() {…} ,方法名自定义建 ...

  7. 堆与堆排序、Top k 问题

     堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满 ...

  8. 死循环的/etc/profile

    用户服务器登陆后停在以下界面 Connecting to ... Connection established. To escape to local shell, press 'Ctrl+Alt+] ...

  9. 通过HBase API进行开发

    http://www.cnblogs.com/netbloomy/p/6683509.html 一.将HBase的jar包及hbase-site.xml添加到IDE 1.到安装HBase集群的任意一台 ...

  10. 运行jar_测试代码

    1.Eclipse 将 工程 导出成 jar Eclipse --> Export... --> 界面中树状图形中选择" Java下的'JAR file' "(不知道这 ...