首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML模式设计方法

XML模式设计方法
EN

Stack Overflow用户
提问于 2011-08-16 11:28:23
回答 3查看 458关注 0票数 0

设计XML模式有两种不同的方法:

  1. 使用匿名complexTypes
  2. 使用命名complexTypes

我的问题是:哪一个更好?

我发现第二个更好,因为它避免了深度嵌套,并允许重用现有类型。它更接近于软件工程的最佳实践。但我看到了此页,我现在很困惑:

这里有一些不合适的。

  • 不要试图成为的主人。可能要花上几个月。
  • 不使用复杂类型、属性声明和符号。
  • 不要使用本地声明。
  • 不要使用替换组。
  • 不要使用没有targetNamespace属性的模式(AKA变色龙模式)。

事实上,你不会因为遵循这些原则而失去任何东西,正如本文的其余部分所演示的那样。

有一些解释,但我觉得不太好。但可能我遗漏了什么..。

准确地说,我将给出这两种方法的例子。示例摘自W3Schools页面。它列出了三种方法,但我忽略了第二种方法,因为它非常类似于第一种方法。

使用匿名complexTypes:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

使用命名的complexTypes:

代码语言:javascript
复制
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
  <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
  <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
  <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
  <xs:restriction base="xs:string">
    <xs:pattern value="[0-9]{6}"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
  <xs:sequence>
    <xs:element name="name" type="stringtype"/>
    <xs:element name="address" type="stringtype"/>
    <xs:element name="city" type="stringtype"/>
    <xs:element name="country" type="stringtype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
  <xs:sequence>
    <xs:element name="title" type="stringtype"/>
    <xs:element name="note" type="stringtype" minOccurs="0"/>
    <xs:element name="quantity" type="inttype"/>
    <xs:element name="price" type="dectype"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
  <xs:sequence>
    <xs:element name="orderperson" type="stringtype"/>
    <xs:element name="shipto" type="shiptotype"/>
    <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
  </xs:sequence>
  <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-20 19:12:43

但我看到了此页,我现在很困惑.

不要让那一页影响你的决定。它是近十年前编写的(根据回车机的说法,2002年2月),当时XML是一个新的、可怕的外观和不受支持的。我曾与作者进行过短暂的合作,并知道他非常精明和务实;然而,我认为该文档针对的是那些发现XML看起来很吓人、支持不足的人,并给他们提供了一张使用XML的手册,只需很少的投资。

票数 2
EN

Stack Overflow用户

发布于 2011-08-16 22:20:26

具有名称的复杂类型比不具有名称的类型更可重用。如果您想以少量输入为代价来最大化可重用性,请列出所有复杂类型的名称。这是你的选择。

川口的设计指南并没有提到如何使用这个模式。如果您只想使用模式进行验证,这是一回事;如果您想使用它在C#或Java中进行数据绑定,这是另一回事;如果您想要使用它来编写模式感知的XSLT和XPath,这又是另一组注意事项。坦白说,我觉得他的建议有点肤浅。

票数 2
EN

Stack Overflow用户

发布于 2011-08-20 21:09:18

XML模式满足各种可能的需求,如数据绑定、类型安全处理、验证或接口定义。模式的设计方法应该反映您的优先级。

例如,具有命名类型对于高级使用非常重要,比如您想要利用XQuery或XSLT中的模式感知XML处理,但如果您只为了验证而需要该模式,则不太重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7077489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档