XML 架构:使用多个命名空间时出错

XML Schema: Errors when using more than one namespace

我正在大学学习 XML,但在使用多个名称空间时遇到困难。从下面的代码可以看出,我希望元素 "enquiries" 有自己的命名空间。经过一些在线研究,我收集到,为了在 XML 模式中支持它,我需要在单独的 xsd 文件中为它创建一个类型,然后导入这个 xsd到主 xsd 文件。

我尝试这样做,我认为我做得很好,但是当我验证 XML 时,我遇到了很多错误。

任何人都可以向我解释我做错了什么吗?

谢谢。

invoice.xml:

<invoice xmlns="http://www.fakenamespace.com/ns/invoices"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.fakenamespace.com/ns/invoices invoice.xsd">
    <company>b2b Software Magic Ltd</company>
    <reference>MyNet201</reference>
    <date>2005-11-11</date>
    <enquiries xmlns:enq="http://www.fakenamespace.com/ns/enquiriesType">
        <enq:name>Paul White</enq:name>
        <enq:phone>0207 634 6547</enq:phone>
    </enquiries>
    <clientbusiness>
        <id>345533</id>
        <contactname>Mr Barrny Hales</contactname>
        <name>MyNetGlobix Plc</name>
        <address>
            <street>2 Caxton Street</street>
            <city>London</city>
            <postcode>SW1 H0QE</postcode>
        </address>
    </clientbusiness>
    <products>
        <product>
            <description>Golden number development version 2 (1 day)</description>
            <amount currency="GBP">500.00</amount>
        </product>
    </products>
    <finalamounts>
        <NET currency="GBP">500.00</NET>
        <VAT>
            <percent>17.5</percent>
            <amount currency="GBP">87.50</amount>
        </VAT>
        <total currency="GBP">587.50</total>
    </finalamounts>
</invoice>

invoice.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"
        targetNamespace="http://www.fakenamespace.com/ns/invoices"
        xmlns="http://www.fakenamespace.com/ns/invoices"
        xmlns:enq="http://www.fakenamespace.com/ns/enquiriesType"
        >
    <xs:import schemaLocation="enquiriesType.xsd" namespace="http://www.fakenamespace.com/ns/enquiriesType" />

    <xs:element name="amount">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="currency" type="xs:float" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="invoice">
        <xs:complexType>
            <xs:sequence> <!-- Maybe change to "all"? -->
                <xs:element name="company" type="xs:string" />
                <xs:element name="reference" type="xs:string" />
                <xs:element name="date" type="xs:date" />
                <xs:element name="enquiries" type="enq:enquiriesType" />

                <xs:element name="clientbusiness">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="id" type="xs:int" />
                            <xs:element name="contactname" type="xs:string" />
                            <xs:element name="name" type="xs:string" />
                            <xs:element name="address">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="street" type="xs:string" />
                                        <xs:element name="city" type="xs:string" />
                                        <xs:element name="postcode" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="products">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="product">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="description" type="xs:string" />
                                        <xs:element ref="amount" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="finalamounts">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="NET">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="currency" type="xs:float" />
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="VAT">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="percent" type="xs:float" />
                                        <xs:element ref="amount" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="total">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="currency" type="xs:float" />
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

enquiriesType.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified"
        targetNamespace="http://www.fakenamespace.com/ns/enquiriesType"
        >
    <xs:complexType name="enquiriesType">
        <xs:sequence>
            <xs:element name="name" type="enq:string" />
            <xs:element name="phone" type="enq:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我发现并解决了所有问题:

  • 我在文件 invoice.xsd 中的 xmlns:enq 中使用了错误的命名空间(我已经通过编辑原始 post 更正了它)。
  • 我在文件 enquiriesType.xsd.
  • 中使用了 type="enq:string" 而不是 type="xs:string"

我还犯了另一个反复出现的错误:我使用 type="xs:float" 而不是 type="xs:string" 作为 "currency" 属性。