XML-XSD:如何正确定义命名空间?

时间:2013-01-22 07:20:35

标签: xml xsd xml-validation

我想知道如何使用XML和XSD正确定义命名空间。我有以下XML文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:app="ms.xsd"
    xsi:schemaLocation="ms.xsd">
    <app:contactPerson>
        <app:name>Florian</app:name>
        <app:countryCode>FR</app:countryCode>
    </app:contactPerson>
    <app:contactPerson>
        <app:name>Gabi</app:name>
        <app:countryCode>DE,EE,EL,FI,FR,IE,UK</app:countryCode>
    </app:contactPerson>
    <app:contactPerson>
        <app:name>Gert</app:name>
        <app:countryCode>GB</app:countryCode>
    </app:contactPerson>
    <app:origin/>
</application>

架构由同一文件夹中的文件 ms.xsd 定义:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    version="0.2"
    targetNamespace="ms.xsd"
    xmlns:app="ms.xsd">
    <xs:element name="application" type="app:applicationType"/>
    <xs:complexType name="applicationType">
        <xs:sequence>
            <xs:element name="contactPerson" type="app:contactPersonType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="origin" type="app:originType" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="contactPersonType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="countryCode" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="originType">
        <xs:sequence minOccurs="0">
            <xs:element name="street" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
            <xs:element name="further_details" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我已经尝试了很多东西。我在这个(当前)最终版本中得到的错误是

错误:元素'应用':没有可用于验证根目录的匹配全局声明。

这是因为xml文件中的xsd-reference是在application-tag中,所以它来得太晚了吗?当我在所有内容周围添加“信封”标签并将xsd-definition放在那里时,我收到消息

错误:元素'包络':验证根目录没有匹配的全局声明。

所以现在我真的很困惑如何正确地做到这一点。我正在使用Notepadd ++中的XML-Tools验证XML对XSD。

2 个答案:

答案 0 :(得分:4)

尝试应用:应用... 这应该工作。无论声明如何发生。

答案 1 :(得分:1)

另一种方法是添加默认命名空间:

xmlns="ms.xsd"

这会将<application>放入该命名空间。实际上,如果你愿意,你可以省略所有其他app:前缀。虽然我认为@ jmcollin92的解决方案更好 - 只是填补空白。

顺便说一句:你的xsi:schemaLocation应该是:

xsi:schemaLocation="ms.xsd ms.xsd"

第一个ms.xsd是命名空间(可以是任意字符串);第二个ms.xsd是可以找到模式的文件(URI - 通常是文件或URL) - 实际上,它可以是这样的对的列表。严格来说,您的xml工具应该标记错误。