在相同的XML中实现新的最佳做法是什么?

时间:2019-02-21 18:02:07

标签: c# web-services web asp.net-web-api soap

我有一个要实现新功能的Web服务。我想知道是否将它们添加到默认XML是一种好习惯,还是应该为此消耗量创建新方法?

一个例子:我有一个方法可以返回产品的特征,颜色,价格,尺寸等。我想实现一个新功能,该功能还将在多个网站上返回价格。实际的XML:

<Product>
    <Name> IPhone X </Name>
    <Color> Black </Color>
    <Type> Smartphone </Type>
</Product>

新XML:

<Product>
    <Name> IPhone X </Name>
    <Color> Black </Color>
    <PriceInSites>
        <Site> www.apple.com </Site>
        <Price> 1000.00 </Price>
    <PriceInSites>
    <Type> Smartphone </Type>
</Product>

鉴于多个客户端已经在不使用该XML块的情况下使用该实现-我应该在单独的方法中使用它吗?

使用相同XML的新实现有什么好的做法?

1 个答案:

答案 0 :(得分:0)

首先,在新的XML中,关闭的PriceInSites标记应看起来像这样</PriceInSites>,而不是这个<PriceInSites>。其次,答案取决于客户愿意为使用新XML付出多少工作。我看不到您的XML模式文档,因此假设您的原始模式看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Type">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" Smartphone "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Product">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Name"/>
                <xs:element ref="Color"/>
                <xs:element ref="Type"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Name">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" IPhone X "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Color">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" Black "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

然后,您的新XML模式应使新插入的标记为可选:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Type">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" Smartphone "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Site">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" www.apple.com "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Product">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Name"/>
                <xs:element ref="Color"/>
                <xs:element ref="PriceInSites" minOccurs="0"/>
                <xs:element ref="Type"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="PriceInSites">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Site"/>
                <xs:element ref="Price"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Price">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:enumeration value="1000.0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Name">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" IPhone X "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Color">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value=" Black "/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

...通过将minOccurs设置为零。仅当您希望继续支持不愿意或无法更新其XML定义以处理新元素的现有XML模式使用者时,才应该这样做。