XML命名空间和schemalocation属性?

时间:2011-06-27 16:32:01

标签: xml xml-namespaces

在许多xml示例中,我看到许多名称标记甚至不在xml中使用,如下例所示我们已将nameschemas定义为xsiaop和一个默认值 命名空间。如果我们不使用它们的目的是定义它们。没有附加xml因为它非常大。

第二个问题是: - 假设我们使用这个nameschemas ..我们通常使用一些网址定义namechemas和schemalocation的值 比如http://someAdddress//。如果我们用一些像ABC或其他东西的任意值来定义它们会怎样。会有什么不同吗?有没有 我们从这些网址处理?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aop="http://www.springframework.org/schema/aop" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/ 
schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema 
/aop/spring-aop-2.0.xsd"> 

另一个问题是我们只为xsi名称空间定义了schemalocation不为aop名称空间定义了。为什么这样?

最后一个问题是我们可以定义名称空间xsi1而不是xsi吗?是否有任何im

3 个答案:

答案 0 :(得分:4)

通常应该是这样的情况:如果文档中没有使用名称空间绑定,那么该名称空间的声明是多余的,可以安全地省略(相反,它在那里不会造成任何伤害。)I说应该是这样,但也有例外。一种是DTD验证,有时需要在特定元素上存在或不存在特定的名称空间声明(DTD处理不能识别名称空间,因此它将名称空间视为属性)。另一个相当罕见的例外:我见过XML词汇表,其中命名空间声明用于传达语义,而不仅仅是声明命名空间前缀的绑定,例如它可能指示版本信息。这是糟糕的XML设计,但是有很多糟糕的XML设计。

对于xsi:schemaLocation,某些工具/应用程序将忽略此项,其他人可能会将其解释为针对在特定位置找到的架构执行架构验证的请求。

答案 1 :(得分:0)

在您的第一段中,您询问我们如何定义XML命名空间并且不使用它?

没有什么不好的事情会发生。它只是供您使用而您不使用它。它就像你的函数中定义的变量,你只是不使用它。

现在你的一个声明中有一个错误,即你没有使用xsi,aop和default命名空间。事实并非如此。因为xsi是xml架构实例。您可以在编写<xsi:schemaLocation ... />的下一行中使用它。它基本上允许您创建在xsd / dtd文件中创建的模式定义的实例。您可能/可能没有使用过aop,在您向我显示xml文件之前我无法判断。现在使用默认命名空间,你有点困惑。 XML文档中的默认命名空间告诉模式验证器,此XML文档中使用的所有元素都在“<some namespace>”命名空间中声明。请参阅“在XML文档中引用模式”标题下的http://www.w3schools.com/Schema/schema_schema.asp

现在你的第二个问题是所有命名空间通常被定义为url。我们可以将其定义为其他名称吗?

是的,你可以。这是一个示例xsd和xml文件。

<?xml
    version="1.0"
    encoding="UTF-8"
?>

<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="mynamespace"
    xmlns="mynamespace"
    elementFormDefault="qualified"
>
    <xs:element name="note">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="to">
                    <xs:complexType>
                        <xs:attribute name="lang" type="xs:string" use="required"></xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

这是XML:

<?xml
    version="1.0"
    encoding="utf-8"
?>

<note
    xmlns:note="mynamespace"
    xmlns="mynamespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="mynamespace myschema.xsd"
>
    <note:to lang="en"></note:to>
</note>

所以你可以看到我为命名空间定义了另一个名字,它在我的eclipse中完美运行。

我认为(我在这里猜测)人们使用URI作为名称空间是有原因的。因为如果您只是保留一个名称,就像我做“mynamespace”而其他人想要导入/使用您的架构,那么您的名字和名称可能会发生冲突。现在你不能写一个简单的名字,并希望世界上每个人都不会使用这个名字,所以人们使用URI作为他们的命名空间,因为URI是唯一的,没有理由让其他人在为他们的应用程序创建模式时使用你的URI

你的第三个问题是为什么我们没有像为xsi那样为app定义schemaLocation?再次查看schemaLocation。您已定义了4个“空格分隔”值。 2表示xsi,2表示aop。

你的最后一个问题是你可以定义xsi1而不是xsi。您可以。事实上,您可以定义任何您想要的名称。它是一个变量,用作表示命名空间的简写。

PS:我最近开始学习XML / XSD。因此,如果您发现我的答案有误,请分享正确答案,我将编辑我的答案。谢谢。

答案 2 :(得分:0)

如果要在不使用命名空间的情况下将XSD架构分配给XML文件,则也可以简单地使用xsi:noNamespaceSchemaLocation属性而不是xsi:SchemaLocationSource

示例:

<myElement
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="myschema.xsd"
>