XML Schema如何声明价格和货币

时间:2012-01-16 17:03:19

标签: xml xsd schema currency

我正在创建一个存储房屋信息的XML架构。

我想存储pricecurrency

在我看来,通过将货币作为价格元素的属性来声明这一点是有道理的。

另外,我想将可以作为currency输入的值限制为磅,欧元或美元。

EG:

<price currency="euros">10000.00</price>

所以目前我在我的XML Schema中将其声明为:

<!-- House Price, and the currency as an attribute -->
<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

我对此有这个问题:

  • 我不确定这是否会将属性元素限制为pounds, euros or dollars
  • 我似乎无法将价格上的type指定为双倍,正如我所希望的那样:

      

    Element 'price' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.

我应该保持简单并将它们声明为单独的元素:

<price>10000.00</price>
<currency>euros</currency>

......还是我走在正确的道路上?

5 个答案:

答案 0 :(得分:14)

取自Michael Kay发布的链接并应用于您的问题。 (注意:使用'decimal'类型而不是'double'来避免精度错误。)

<xs:element name="price">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:decimal">
        <xs:attribute name="currency" type="currencyType"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

<xs:simpleType name="currencyType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds"/>
    <xs:enumeration value="euros"/>
    <xs:enumeration value="dollars"/>
  </xs:restriction>
</xs:simpleType>

---- Example ----

<price currency="euros">10000.00</price>

答案 1 :(得分:4)

您需要“具有简单内容的复杂类型”。你可以在这里找到一个例子:

http://www.w3schools.com/schema/el_simpleContent.asp

答案 2 :(得分:3)

或作为迈克尔斯答案的延伸:

<xs:element name="price">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:decimal">
                <xs:attribute name="currency">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="pounds" />
                            <xs:enumeration value="euros" />
                            <xs:enumeration value="dollars" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

如果你想在一个标签中。只需将枚举属性添加到十进制类型,就可以实现所需的结果。

答案 3 :(得分:2)

以下内容将price元素定义为xs:double值,其currency属性的值限制为:磅,欧元或美元。

 <xs:element name="price">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:double">
                    <xs:attribute name="currency">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="pounds" />
                                <xs:enumeration value="euros" />
                                <xs:enumeration value="dollars" />
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

答案 4 :(得分:0)

作为使用中的做法,请查看PayPal's SOAP API的实现。

该服务为ISO-4217 standard之后的货币(在eBLBaseComponents.xsd中定义的CurrencyCodeType)定义了一组代码。

AmountType(由CoreComponentTypes.xsd定义)是具有currencyType属性的double的组合。

我建议在您的应用程序中使用类似的方法,限制业务逻辑中的可接受货币,而不是模式。

干杯!