为了防止不同XML 使用的名称冲突,XML 规范中规定的命名空间,平时编写单一命名空间的XML 文档,没有过多地注意XML 命名空间的细节。当开发OPCUA 信息模型时,被命名空间搞得云里雾里。为此,做了一个笔记。
URI(Uniform Resource Identifiers)统一资源标志符
统一资源标志符(英语:Uniform Resource Identifier,缩写:URI)在电脑术语中是用于标志某一互联网资源名称的字符串。
我们知道,通常将网址称为URL,比如
string url = "https://www.csdn.com“
那么URL 与URI 有什么区别呢?它们是如此定义的。
- URI(Uniform Resource Identifier,统一资源标识符)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对网络中(一般指万维网)的资源通过特定的协议进行交互操作。
- URL(Uniform Resource Locator,统一资源定位符),最常见的形式是 URI,经常指定为非正式的网址。
URI 本质上是一种标识符的命名方式,从这种命名中可以直观地了解相关信息。它的语法为
例子:
https://opcua.rocks/UA/animal/
值得注意的是这是一个URI ,并不意味着可以在https://opcua.rocks/UA/animal/网站上可以找到该资源。
同时,URL 可以是URI 的子集,这些 URI 通过其网络位置标识资源。它们还指定了检索资源的机制。例如,网址:
http://example.org/wiki/Main_Page
指资源 /wiki/Main_Page。资源采用 HTML 格式,可通过超文本传输协议 (http:) 从名为 example.org 的网络主机获取。
无论无何,你可以将URI 看作一个携带某些信息的标识符就好了。在XML 文本中,有各种NameSpaceURI ,它们并不是网址。
XML 命名空间(xmlns)
xmlns就是xml nameSpace的缩写,即xml的命名空间。在XML 文件中有许多xmlns 的属性,用来标识命名空间的信息,例如
<?xml version="1.0" encoding="utf-8"?>
<ModelDesign
xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ua="http://opcfoundation.org/UA/"
xmlns:ANIMAL="https://opcua.rocks/UA/animal/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
TargetNamespace="https://opcua.rocks/UA/animal/"
TargetXmlNamespace="https://opcua.rocks/UA/animal/"
TargetVersion="0.9.0"
TargetPublicationDate="2019-04-01T00:00:00Z"
xmlns="http://opcfoundation.org/UA/ModelDesign.xsd"/>
为什么需要命名空间
多个文档描述资源时,可能出现名称的冲突,例如下面两个xml 文档
第一个
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
第二个
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
这两个文档中同样使用<table> 标签,但是一个标识表格,一个标识咖啡桌。
为了区别两者,我们就需要两个命名空间
表格:URI:http://www.abc.com/TR/html4/
桌子:URI:http://www.xyz.com/furniture
<root xmlns:h="http://www.abc.com/TR/html4/"
xmlns:f="http://www.xyz.com/furniture">
<h:table>
<h:tr>
<h:td>Aries</h:td>
<h:td>Bingo</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Computer table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
xmlns 的格式
xmlns:<name>=<"uri">
其中name 是命名空间的名称前缀,uri 是该命名空间的URI,例如:
xmlns:ua="http://opcfoundation.org/UA/"
在文档中如果引用该命名空间内的标签,加上ua的前缀。
例子:
<?xml version = "1.0" encoding = "UTF-8"?>
<cont:contact xmlns:cont = "www.tutorialspoint.com/profile">
<cont:name>Tanmay Patil</cont:name>
<cont:company>TutorialsPoint</cont:company>
<cont:phone>(011) 123-4567</cont:phone>
</cont:contact>
这里命名空间的前缀是cout,命名空间的URI 是www.tutorialspoint.com/profile。这题为在属性和名称之前冠以cout,表示它属于www.tutorialspoint.com/profile命名空间。
缺省的命名空间
缺省的命名空间可以不使用前缀。这里缺省的命名空间是
http://www.javapoint.com/java-tutorial
<tutorials xmlns="http://www.javatpoint.com/java-tutorial">
<tutorial>
<title>Java-tutorial</title>
<author>Sonoo Jaiswal</author>
</tutorial>
...
</tutorials>
OPCUA 的命名空间
每个信息模型都必须有自己唯一的标识 URI。对于基本的 OPC UA 规范,此 URI 为 :http://opcfoundation.org/UA/
其他配套规范或自定义规范定义其自己的命名空间 URI,例如,用于 DI 规范为 :http://opcfoundation.org/UA/DI/
在 OPC UA 服务器内部,命名空间由命名空间索引标识。索引 0 始终是基本节点集,索引 1 用于不属于特定节点集的任何节点实例。
根据用例,服务器可以将其他节点集加载到其地址空间中。这些节点集通常从索引 2 开始。
命名空间的嵌套
OPC UA 信息模型是基于模块设计的,大的模块通过小模型构成。因此,信息模型的xml 文件的命名空间也是分层定义的。
最底层是htttp://www.opcfoundation.org/UA。在其上可以根据模块的分层架构逐步添加。例如配套规范PLCopen 引用了配套规范DI 的模型。
在OPCUA Server 中导入NodeSet2时将会根据导入的顺序,将命名空间的URI 存放在NameSpaceArray 中。而命名空间在命名空间数组中的索引就是OPACUA NodeId 的ns。NodeSet导入的顺序是由讲究的,不能搞乱。另外,www.opcfoundation.org/UA是服务器内置的,不需要导入。