如何为具有不同类型的XML创建架构

时间:2014-10-17 12:19:45

标签: xml xsd schema

如何在下面为我的XML创建XSD(架构)。我已经尝试了所有的东西,但我不能让它工作,即使是w3schools也没有任何关于如何解决这个问题的例子。我正在尝试限制和验证所有字段,并且当有人添加新的应用程序时,它也需要能够正常工作,例如<appCategory type="Sports">

<?xml version="1.0" encoding="ISO8859-1" ?>
<?xml-stylesheet type="text/xsl" href="q2.xsl"?>

<app xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com q3.xsd">
    <appCategory type="Productivity">
        <appItem fileName="Messages" version="0.2" price="34.99">Thunderbird</appItem>
        <appItem fileName="Contacts" version="2.0" price="3.00">Convenience Book</appItem>
        <appItem fileName="Calendar" version="1.0" price="45.00">ForgetMilk</appItem>
        <appItem fileName="Email" version="1.3" price="3.45">Email</appItem>
    </appCategory>
    <appCategory type="Games">
        <appItem fileName="BrickBreaker" version="7.1" price="14.99">Brick Breaker</appItem>
        <appItem fileName="WordMole" version="4.1" price="22.99">Word Mole</appItem>
        <appItem fileName="FistOfAwesome" version="4.1" price="3.99">Fist of Awesome</appItem>      
    </appCategory>
    <appCategory type="Social networking">
        <appItem fileName="BlackBerry Messenger" version="0.2" price="0.99">Blackberry Messenger</appItem>
        <appItem fileName="Twitter" version="1.1" price="24.99">Twitter</appItem>
        <appItem fileName="Facebook" version="0.5" price="44.99">Facebook</appItem>
        <appItem fileName="Grodog" version="0.5" price="1.99">Grodog</appItem>
        <appItem fileName="LinkedIn" version="2.1" price="3.59">LinkedIn</appItem>
        <appItem fileName="YouTube" version="5.5" price="1.59">YouTube</appItem>
    </appCategory>
</app>

2 个答案:

答案 0 :(得分:1)

这种文档设计不是XML模式设计要处理的。 XML被设计为可扩展的,并且您正在使用它,就好像它不是,在顶部添加您自己的可扩展性层。如果您的文档如下所示:

<app  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com q3.xsd">
    <Productivity>
        <Messages version="0.2" price="34.99">Thunderbird</Messages>
        <Contacts version="2.0" price="3.00">Convenience Book</Contacts>
        <Calendar version="1.0" price="45.00">ForgetMilk</Calendar>
        <Email version="1.3" price="3.45">Email</Email>
    </Productivity>
    <Games>
        <BrickBreaker version="7.1" price="14.99">Brick Breaker</BrickBreaker>
        <WordMole version="4.1" price="22.99">Word Mole</WordMole>
        <FistOfAwesome"= version="4.1" price="3.99">Fist of Awesome</FirstOfAwesome>      
    </Games>
那么你会有更好的机会。

顺便说一句,您不应该在不属于您的命名空间中定义元素。

答案 1 :(得分:1)

  

当有人添加新的应用类别时,它需要能够正常工作

这是一项关键要求。如果必须添加新应用类别的某人是负责执行该应用的个人或组织,则XML文档的结构使得必须仅在授权类别中找到应用,请参阅Michael Kay&#39的答案。

但是,如果XSD的所有者仅希望捕获应用程序的动态分类,而不强制哪些项目必须出现在哪些类别中,那么您的设计就足够了,以及满足您需求的以下简单XSD。

您甚至可以将这些方法组合成两层,其中第一层捕获应用程序分类的持续构建,第二层可以在审查和批准之后提供针对分类的验证。如果第一层使用有关元素/属性名称的其他元数据进行扩充,则第二层甚至可以从第一层自动派生。

没有命名空间的XML / XSD示例

可以找到在线验证证明here

XML

<?xml version="1.0" encoding="ISO8859-1" ?>
<?xml-stylesheet type="text/xsl" href="q2.xsl"?>
<app>
    <appCategory type="Productivity">
        <appItem fileName="Messages" version="0.2" price="34.99">Thunderbird</appItem>
        <appItem fileName="Contacts" version="2.0" price="3.00">Convenience Book</appItem>
        <appItem fileName="Calendar" version="1.0" price="45.00">ForgetMilk</appItem>
        <appItem fileName="Email" version="1.3" price="3.45">Email</appItem>
    </appCategory>
    <appCategory type="Games">
        <appItem fileName="BrickBreaker" version="7.1" price="14.99">Brick Breaker</appItem>
        <appItem fileName="WordMole" version="4.1" price="22.99">Word Mole</appItem>
        <appItem fileName="FistOfAwesome" version="4.1" price="3.99">Fist of Awesome</appItem>      
    </appCategory>
    <appCategory type="Social networking">
        <appItem fileName="BlackBerry Messenger" version="0.2" price="0.99">Blackberry Messenger</appItem>
        <appItem fileName="Twitter" version="1.1" price="24.99">Twitter</appItem>
        <appItem fileName="Facebook" version="0.5" price="44.99">Facebook</appItem>
        <appItem fileName="Grodog" version="0.5" price="1.99">Grodog</appItem>
        <appItem fileName="LinkedIn" version="2.1" price="3.59">LinkedIn</appItem>
        <appItem fileName="YouTube" version="5.5" price="1.59">YouTube</appItem>
    </appCategory>
</app>

XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="app">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="appCategory" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="appItem" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="fileName"/>
                      <xs:attribute name="version"/>
                      <xs:attribute name="price"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="type"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>