我正在做一个用于学习目的的个人管理器,我从未使用过XML,所以我不确定我的解决方案是否是最好的。这是我附带的XML文件的基本结构:
<calendar>
<year value="2008">
<month value="october">
<day value="16">
<activity name="mike's birthday" time="21:00" address="mike's apartment" urgency="10">
activity description.
</activity>
</day>
</month>
</year>
</calendar>
紧急属性应该是1到10的等级。
我在谷歌上做了一个快速搜索,但找不到一个好的例子。也许这不是最好的解决方案,我想知道它是否足够。如果有任何相关性,我正在使用PHP进行应用程序。
答案 0 :(得分:2)
你的方式对我来说已经足够了。但是,我更喜欢子标签属性,所以我的方式更像是:
<activity>
<name>Mike's Birthday</name>
<time>2100</time>
<address>Mike's Place</address>
<urgency>10</urgency>
<description>activity description</description>
</activity>
但就像我说的那样,你的方式很好。
快速提问 - 为什么不是数据库?
答案 1 :(得分:1)
您可能已经天真地到达了这一点,但您的XML设计的主要特点是它针对按日期搜索进行了优化。如果您的XML文档很大,而且您按日期进行了大量搜索(我怀疑这是个人管理器中最常见的用例),这是一件好事。
执行此XPath模式:
/calendar/year[@value='2008']/month[@value='10']/day[@value='7']/activity
将检查比使用Kev更简单的扁平化组织需要使用的模式更少的节点:
/calendar/activity[@year='2008' and @month='10' and @day='7']
基本上必须查看文档中的每个节点。
顺便说一句,请注意,我假设month
和day
属性是数字。这很重要,因为你几乎肯定想要在某个时候对这些数据进行排序,除非你要维护文档中的排序顺序(我承认,可以为其做出论证),你'我希望这些属性的形式很容易对它们进行排序。
在这些属性中存储数值数据的方式也很重要。 (如果您希望在会议中听起来很聪明,可以说您正在建立数据类型的规范表示。)例如,如果您使用前导零而不是其他零,那么这些XPath模式都不会可靠地工作,因为@day='7'
与设置为day
的{{1}}属性不匹配。 (你可以通过使用"07"
函数将属性转换为XPath中的数字来解决这个问题,但首先避免问题会更好。)
答案 2 :(得分:0)
您可以将该层次结构缩小为:
<calendar>
<activity
id="123456"
name="mike's birthday"
year="2008"
month="10"
day="16"
time="21:00"
address="mike's apartment"
urgency="10">
activity description.
</activity>
</calendar>
或..
<calendar>
<activity id="12345">
<name>mike's birthday</name>
<year>2008</year>
<month>10<month>
<day>16</day>
<time>21:00</time>
<urgency>10</urgency>
<address>mike's apartment<address>
<description>activity description.</description>
</activity>
</calendar>
在XPath查询中,它会让生活变得更加痛苦。我还添加了一个id属性,以便您可以唯一地标识活动。
答案 3 :(得分:0)
我认为你的结构对于你正在做的事情会很好。
如果您计划部分地使用它来学习XML,您可以考虑使用属性和元素的混合,以便您可以练习使用每个元素的集合。一旦您对XML更加熟悉,您可能会开始定义规则,用于确定哪些属性成为属性以及哪些属性成为元素。
使用正确的代码,您可以在XML文件和数据库表之间来回移动信息。您也可以开始学习XSL,这样您就可以在不更改原始XML文件的情况下练习移动(或者,一旦数据在表中,甚至没有原始XML文件)。
答案 4 :(得分:0)