LINQ学习笔记:XML命名空间

来源:互联网 发布:数据库系统是以为中心 编辑:程序博客网 时间:2024/05/18 17:58

 WebjxCom提示:XML命名空间主要完成两件事情. 首先, 与C#的命名空间一样, 它们可以帮助避免命名冲突. 当你要合并来自两个不同XML文件的时候这可能会成为一个问题. 其次, 命名空间赋予了名称一个绝对的意义.

 

名称与命名空间

与.NET类型可以拥有命名空间一样, XML元素和属性也同样可以拥有命名空间.

XML命名空间主要完成两件事情. 首先, 与C#的命名空间一样, 它们可以帮助避免命名冲突. 当你要合并来自两个不同XML文件的时候这可能会成为一个问题. 其次, 命名空间赋予了名称一个绝对的意义. 例如, 名称”nil” 可以代表任何意思, 然而, 如果和http://www.w3.org/2001/XMLSchema-instance命名空间一起, “nil”表示类似于C#当中null的意思, 并且有特定的规则指示其如何被应用.

XML的命名空间是使用xmlns属性来定义的:

xmlns是一个特殊的保留属性. 当我们这样使用时, 它主要执行两个功能:

  • 它为有疑问的元素指定了一个命名空间
  • 它为所有后代元素指定了一个默认的命名空间

我们也可以使用一个前缀(prefix)指定命名空间——这可以用来避免重复.主要有两个步骤——定义前缀和使用前缀. 我们也可以类似下面的做法将它们同时定义:

两件不同的事情在这里产生. 在右边, xmlns:nut=”…”定义了一个前缀叫做nut并使其对于元素本身以及它所有的后代元素都是可用的. 在左边, nut:customer应用了最新定义的前缀到customer元素上.

一个被定义了前缀的元素不会为它的后代元素定义默认的命名空间. 在下面的XML片段中, firstname包含一个空的命名空间:

为了将OReilly.NutShell.CSharp的前缀给予firstname, 我们必须使用下面的做法:

我们也可以将命名空间赋值到属性上, 不同之处在于它总是要求一个前缀. 例如:

另一个不同之处在于一个未经修饰的属性总是包含一个空的命名空间: 其永远不会从父元素继承一个默认的命名空间.

在X-DOM当中指定命名空间

有几种办法可以用来指定XML的命名空间. 首先是将其包括在local name之前的一个大括号里面, 如:

 

输出的结果为:

 

 

第二种做法是使用XNamespace和XName, 以下是它们的定义:

 

所有的类型定义都是使用string的隐式转换, 因此下面的代码是合法的

XName还提供了+操作符的重载, 允许你在没有使用大括号的情况下将命名空间和名称组合在一起.

 

所有在X-DOM当中定义的可以元素或者属性名的构造器和方法时间上都是接受一个XName对象而不是字符串. 原因就是我们上面例子使用的方法——string的隐式转换.

指定一个命名空间到元素或者属性也是一样的:

 

X-DOM与默认命名空间

X-DOM会一直忽略默认命名空间的观念指导它被输出成了XML. 这意味着当你构建一个子XElement, 如果需要的话你必须显式给予它一个命名空间: 因为它不会从父亲元素那里继承:

 

 

前缀

X-DOM对待前缀就像它对待命名空间一样, 主要也是为了序列化功能. 这意味着你可以选择完全忽略前缀——这是可行的. 唯一的理由是为了输出XML文件时更加有效. 例如, 考虑如下代码:

 

 

输出结果:

原创粉丝点击