XML中的名称空间
我在浏览以前的考试集,其中一个问题涉及到XML文档中名称空间的使用。现在的问题去如下:XML中的名称空间
什么是下面的XML文档中的元素FOO的命名空间?
<xyz xmlns="http://baz.net" xmlns:foo="http://www.foo.org">
<namespace xmlns:xyz="http://www.foo.org"/>
<def xmlns:dwebtek="http://www.cs.au.dk/dWebTek">
<foo foo:xmlns="http://www.bar.com"/>
</def>
</xyz>
我最初的想法是选项2.我注意到它们在foo元素标记中换了foo和xmlns。这有什么影响?这仍然会被认为是格式良好的XML吗?
我的第二个想法是选择1,因为在xyz元素标记中,他们将foo的名称空间定义为“http://www.foo.org”。
然而,检查答卷,说正确的答案是选项3.为什么这是?这可能是答案中的错误吗?如果没有,为什么选项2不正确?
编辑:小修正
正确的答案是3的确。
让我们仔细查看声明的命名空间是什么,以便您可以找出原因。
第一行:
<xyz xmlns="http://baz.net" xmlns:foo="http://www.foo.org">
它声明两个命名空间:
-
http://baz.net
这是所有无前缀元素的默认命名空间URI。这将适用于文档中的所有元素,除非另有xmlns
。 -
http://www.foo.org
,它与foo
前缀绑定。该名称空间将仅适用于以foo:
前缀开头的元素(或属性),例如,<foo:bar>
二线
<namespace xmlns:xyz="http://www.foo.org"/>
它连接的http://www.foo.org
命名空间URI的xyz
前缀。 <namespace>
标记在此处连接到http://baz.net
名称空间URI,因为它没有前缀。
三线
<def xmlns:dwebtek="http://www.cs.au.dk/dWebTek">
它连接的http://www.cs.au.dk/dWebTek
命名空间URI的dwebtek
前缀。此时,<def>
标记附加到http://baz.net
名称空间URI。
四线
<foo foo:xmlns="http://www.bar.com"/>
这里有一个窍门,foo:xmlns
是不命名空间声明,因为它不与xmlns
启动。它的属性为xmlns
,前缀为foo
(并且不建议为属性命名为xmlns,即使在这里它是正确的)。您的元素<foo>
没有前缀,因为xmlns
从一开始就是http://baz.net
(还因为在文档的其他任何地方还没有找到其他xmlns
),所以它仍然附加到默认名称空间URI。
注:
有了您的文档中的行:
<foo xmlns="http://www.bar.com"/>
右前面回答将是2,这个时候。
非常感谢。我现在看到了这个问题。前缀命名为foo,元素命名为foo欺骗了我。谢谢您的帮助! –
那么你怎么知道potame的解释其实是正确的?它可以被查询!
DECLARE @t XML = '
<xyz xmlns="http://baz.net" xmlns:foo="http://www.foo.org">
<namespace xmlns:xyz="http://www.foo.org"/>
<def xmlns:dwebtek="http://www.cs.au.dk/dWebTek">
<foo foo:xmlns="http://www.bar.com"/>
</def>
</xyz>';
-- To see the NS of the 1st foo element
select @t.value('namespace-uri((//*:foo)[1])','varchar(200)');
-- To see the NS of all foo elements
select x.n.value('namespace-uri(.)','varchar(200)') from @t.nodes('//*:foo') x(n);
因此证明他是。
从技术上讲,名称空间不能是空字符串,但可以是“空名称空间”。 – JLRishe