2017-03-22 165 views
0

我在浏览以前的考试集,其中一个问题涉及到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> 
  1. http://www.foo.org
  2. http://www.bar.com
  3. http://baz.net
  4. 空字符串
  5. http://www.cs.au.dk/dWebTek

我最初的想法是选项2.我注意到它们在foo元素标记中换了foo和xmlns。这有什么影响?这仍然会被认为是格式良好的XML吗?

我的第二个想法是选择1,因为在xyz元素标记中,他们将foo的名称空间定义为“http://www.foo.org”。

然而,检查答卷,说正确的答案是选项3.为什么这是?这可能是答案中的错误吗?如果没有,为什么选项2不正确?

编辑:小修正

+0

从技术上讲,名称空间不能是空字符串,但可以是“空名称空间”。 – JLRishe

回答

2

正确的答案是3的确。

让我们仔细查看声明的命名空间是什么,以便您可以找出原因。

第一行:

<xyz xmlns="http://baz.net" xmlns:foo="http://www.foo.org"> 

它声明两个命名空间:

  1. http://baz.net这是所有无前缀元素的默认命名空间URI。这将适用于文档中的所有元素,除非另有xmlns
  2. 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,这个时候。

+0

非常感谢。我现在看到了这个问题。前缀命名为foo,元素命名为foo欺骗了我。谢谢您的帮助! –

0

那么你怎么知道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); 

因此证明他是。