初学者在解析XML文件的时候最容易遇到的问题恐怕就是XML的namespace了,本文旨在对namespace做一个简要的介绍。

namespace的意义无需多说,和C++,C#等高级语言一样,XML同样面临大量文件放在一起的时候变量重名的问题,所以要用namespace把名字相同意义不同的变量隔离开。本文着重讨论namespace的解析方法。

以下是一个简单的XML文件:

<root>

<child id = ‘0’>

hello world

</child>

<child id='1'>

one

</child>

</root>

这个例子里面没有namespace,大家初学XML时接触的例子恐怕都是这样的。这种例子具有误导性,初学者解析出了hello world之后就兴高采烈的拿同样的程序去解析实际的XML文件,往往铩羽而归。下面是一段豆瓣API返回的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:db="http://www.douban.com/xmlns/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/">
  <id>http://api.douban.com/event/10069638</id>
  <title>Debugging the Web </title>
  <category scheme="http://www.douban.com/2007#kind" term="http://www.douban.com/2007#event.salon"/>
  <author>
    <link href="http://api.douban.com/people/1057620" rel="self"/>
    <link href="http://www.douban.com/people/aka/" rel="alternate"/>
    <link href="http://t.douban.com/icon/u1057620-16.jpg" rel="icon"/>

name>胖胖的大头鱼</name>
    <uri>http://api.douban.com/people/1057620</uri>
</author>

<db:attribute name="invite_only">no</db:attribute>

看到这么多www就不想看直接跳过,然后看到熟悉的<author> </author>, 果断套用上面例子的程序,一运行却啥都得不到,问题到底出在哪?C#提供一大堆的XML类,XDocument, XReader, XPath, XmlDocument,是不是我现在用的这种类不给力啊,没法确定只好乱试,一乱试一晚上就过去了。童鞋,我们还是静下心来逐行看看吧。

<?xml version="1.0" encoding="UTF-8"?>这行没看头,看下面这里<entry xmlns="http://www.w3.org/2005/Atom" ,xmlns就是xml namespace的意思,这坑爹的http://www.w3.org/2005/Atom到底是个啥呢。再往后看,xmlns:db="http://www.douban.com/xmlns/" ,结合<db:attribute name="invite_only">no</db:attribute>这句话,可以理解了,db是一个namespace的简称,方便写在元素的名字前面,这样<db:attribute> 和 <attribute>, <gd:attribute>就不一样了。这种简称可以在一个文档里面区别变量,但是对大量的文档还是不行,所以namespace还有一个全称,就是这里的http://www.douban.com/xmlns/。这个全称其实写什么内容都行,对XML Parser来说都是当做字符串来处理的,但一来想名字比较麻烦,二来可以顺道做个广告,所以大家一般都用的网址。Parse的时候Parser根据全称来区别变量,所以就算两个文档中都有<db:attribute>,只要全称不一样,都没有问题。

这么说就比较清楚了,但那个http://www.w3.org/2005/Atom到底是个啥啊,连个简称都没有。哎,意识到这个就对了,他的简称就是””,空串。这东西被称为default namespace,那些看上去没有前缀的都是在这个namespace下的。所以那个<author>不是裸的啊,人家其实是 <”http://www.w3.org/2005/Atom” : author> 所以裸的程序当然是解析不了的了。

那么该如何解析呢?这里提供一个样例程序,希望对大家有帮助。这个代码可以在WP7上运行。我还有一个版本用的XmlDocument,尼玛WP7上木有这个类,坑爹的。。。

string file = @"C:\Users\v-menlin\Documents\Visual Studio 2010\Projects\test\test\test.xml";
            XDocument doc = XDocument.Load( file );
            //use following code to parse a string 
            //XDocument doc = XDocument.Parse( string );

//对于XML文件中所有的没加类似db:这种的元素,用下列方法
            XNamespace d = @"http://www.w3.org/2005/Atom";
            foreach ( XElement element in doc.Descendants( d + "title" ) )
            {
                Console.WriteLine( element.Value );
            }
            //<author>下面包含了<link>,一下的例子还示例了如何读取属性。
            foreach ( XElement element in doc.Descendants( d + "author" ) )
            {
                foreach ( XElement inelement in element.Descendants( d + "link" ) )
                {
                    Console.WriteLine( inelement.Attribute( "href" ).Value );
                    Console.WriteLine( inelement.Attribute( "rel" ).Value );
                }
            }

Console.WriteLine();
            //对于加了冒号前缀的元素,使用下列代码
            XNamespace db = @"http://www.douban.com/xmlns/";
            foreach ( XElement element in doc.Descendants( db + "attribute" ) )
            {
                Console.WriteLine( element.Attribute( "name" ).Value );
                Console.WriteLine( element.Value );
            }
            //其实只是NameSpace的头部换了一下。

//下面列出其他几个常用头部,直接换用。
            XNamespace gd = @"http://schemas.google.com/g/2005";
            XNamespace opensearch = @"http://a9.com/-/spec/opensearchrss/1.0/";

from: http://www.cnblogs.com/meng-meng/archive/2011/09/26/2192355.html

XML解析中的namespace初探相关推荐

  1. Spring的XML解析中关于DTD的路径问题-

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在Spr ...

  2. 不小心设置了xml文件中的namespace(xmln)如何取消

    idea-setting-languages & Frameworks Schemas and DTDs可以看到配置过的schemas和DTDS 点左侧的➖就可以取消了

  3. Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

    1. Mybatis工作流程 1.1 使用MySQL创建数据库girls并生成一个表boys,如下图. 1.2 创建该表对应的简单实体类Boys,如下图. 1.3 创建Dao接口以及和接口同名的map ...

  4. 数据解析1:XML解析(2)

    上一篇着重记录了XML解析中的SAX解析,该篇继续上篇(数据解析1:XML解析(2))未讲完的内容. XML补充: 1. 2. . 3. 示例:使用SAX解析一个比较复杂的XML文件 1 <?x ...

  5. mapper注解的主要作用_Mybatis中mapper的xml解析详解

    上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder. 基础介绍 回顾下之前是在分析config ...

  6. 解析xml_Mybatis中mapper的xml解析详解

    上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder. 基础介绍 回顾下之前是在分析config ...

  7. Java中Xml解析详解 DOM、SAX、JDOM、DOM4J

    1.1 什么是XML 一种表示结构化信息的标准方法,以使计算机能够方便地使用此类信息,并且人们可以非常方便地编写和理解这些信息.XML 是 eXtensible Markup Language(可扩展 ...

  8. python 处理xml pandas_python中的XML解析Pandas在

    考虑在节点上使用lxml的xpath(),并使用lxml的parse()直接读取文件.XPath循环迭代地附加到list和dictionary容器以强制转换到dataframe.此外,所需的输出实际上 ...

  9. 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )

    文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...

最新文章

  1. 一张图看懂项目管理的47个过程
  2. 关于使用“JS获取屏幕,浏览器,网页高度宽度”的个人思考
  3. 中国交通建设PPP模式产业投资现状及运营前景规划咨询报告2021版
  4. CG-CTF-Web-层层递进
  5. IOS笔记CALayer的position和anchorPoint
  6. 什么是初效过滤器_初效过滤器怎么样 初效过滤器特点介绍【详解】
  7. 提取二维矩阵中分块后指定的块
  8. idea部署web项目到tomcat注意事项
  9. 在Linux上使用的10种云备份方案
  10. Google Drive 被曝0day,可诱骗用户安装恶意软件
  11. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现
  12. Jquery 判断IE
  13. 细数2011TurboMail企业邮箱功能新飞跃
  14. 淘宝搜索上传图片获得上传sid
  15. 第一章 核磁共振的物理学基础
  16. java 大数加减算法
  17. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
  18. AMBA总线协议的学习-AHB,ASB,APB三种总线以及AXI接口
  19. 我收藏的短线操作技巧
  20. 载体坐标系-惯性坐标系-世界坐标系

热门文章

  1. 【机器学习】什么是机器学习?(下)
  2. 【风控建模】信用评分卡模型简介
  3. The Annotated Transformer
  4. hadoop入门-在windows上安装,测试hadoop
  5. Apache ZooKeeper - Leader Election使用场景
  6. Java 8 - 05 方法引用
  7. Redis进阶-Redis的惰性删除
  8. Spring-AOP @AspectJ进阶之绑定代理对象
  9. Spring-ApplicationContext解读
  10. 跨进程访问(AIDL服务)