XML Schema:使用多个名称空间时出错

时间:2015-03-22 17:40:31

标签: xml xsd

我在uni学习XML,并且在使用多个命名空间时遇到困难。从下面的代码中可以看出,我希望元素“queries”拥有自己的命名空间。在一些在线研究之后,我收集到了为了在XML Schema中支持它,我需要在一个单独的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>

1 个答案:

答案 0 :(得分:0)

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

  • 我在文件invoice.xsd中的xmlns:enq中使用了错误的命名空间(我已经通过编辑原始帖子对其进行了更正)。
  • 我使用了type =&#34; enq:string&#34;而不是type =&#34; xs:string&#34;在文件enquiriesType.xsd。

我还有另一个反复出现的错误:我使用了type =&#34; xs:float&#34;而不是type =&#34; xs:string&#34;对于&#34;货币&#34;属性。