我有一个表示数据库中产品的XML模式,我试图找出将产品图像引用存储为XML节点的最佳方法。将有一个主图像,然后是替代图像,每个图像都有序列(显示顺序)。这是一种合适的格式,还是有更好的方法:
<item>
<id></id>
<images>
<image width="" height="" href="" alt="" sequence="1" />
<image width="" height="" href="" alt="" sequence="2" />
<image width="" height="" href="" alt="" sequence="3" />
<image width="" height="" href="" alt="" sequence="4" />
</images>
</item>
显然会有比这更多的节点,但我没有全部显示它们。我认为我的主要图像永远是序列中的第一个。我遇到的问题是这些图像中的每一个都有缩略图,中图和大图,所以我认为这需要进一步细分。
答案 0 :(得分:2)
由于XML元素具有自然顺序(即它们在XML文件中出现的顺序),因此包含sequence
属性可能是多余的。您仍然可以谈论元素的顺序,主要产品图像仍然是“第一个”。
所以也许:
<images>
<imageset>
<image size="thumbnail" width="" height="" href="" alt="" />
<image size="medium" width="" height="" href="" alt="" />
<image size="large" width="" height="" href="" alt="" />
</imageset>
<imageset>
<image size="thumbnail" width="" height="" href="" alt="" />
<image size="medium" width="" height="" href="" alt="" />
<image size="large" width="" height="" href="" alt="" />
</imageset>
</images>
答案 1 :(得分:1)
稍微扩展Greg的设计:将图像大小设为元素名称而不是将size
作为属性,即:。
<imageset>
<thumbnail width=""... />
<medium width="".../>
<large width="".../>
</imageset>
这有两个原因。
首先,名称imageset
已经告诉您其子元素将成为图像,因此命名子项image
是多余的。使用imageset/*
的XPath模式就像使用imageset/image
一样容易,编写imageset/medium
比编写imageset/image[@size='medium']
更容易。
更重要的原因是此设计允许您的架构指定imageset
元素必须包含每种类型图像中的一种。 (或者指定一个或多个图像类型是可选的。)