如何在下面为我的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>
答案 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。
您甚至可以将这些方法组合成两层,其中第一层捕获应用程序分类的持续构建,第二层可以在审查和批准之后提供针对分类的验证。如果第一层使用有关元素/属性名称的其他元数据进行扩充,则第二层甚至可以从第一层自动派生。
可以找到在线验证证明here。
<?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>
<?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>