2

我正在做一个用于学习目的的个人组织者,而且我从未使用过 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>

urgency 属性应该在 1 到 10 的范围内。
我在 google 上进行了快速搜索,找不到一个很好的例子。也许这不是最好的解决方案,我想知道它是否足够。如果有任何相关性,我正在用 PHP 做应用程序。

4

5 回答 5

2

你的方法对我来说已经足够了。但是,我更喜欢子标签而不是属性,所以我的方式更像是:

<activity>
  <name>Mike's Birthday</name>
  <time>2100</time>
  <address>Mike's Place</address>
  <urgency>10</urgency>
  <description>activity description</description>
</activity>

但就像我说的,你的方式很好。

不过,快速的问题 - 为什么不是数据库?

于 2008-10-16T18:36:11.677 回答
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']

基本上必须查看文档中的每个节点。

请注意,顺便说一下,我假设monthandday属性是数字的。这很重要,因为您几乎肯定会在某个时候对这些数据进行排序,除非您要维护文档中的排序顺序(我承认,可以为此提出一个论点),否则您我希望这些属性以易于排序的形式出现。

在这些属性中存储数字数据的方式保持一致也很重要。(如果您想在会议中听起来很聪明,您可以说您正在建立数据类型的规范表示。)例如,如果您有时使用前导零而不是其他时间,那么这些 XPath 模式都不会可靠地工作,因为与设置为 的属性@day='7'不匹配。(您可以通过使用该函数将属性转换为 XPath 中的数字来解决此问题,但首先避免该问题会更好。)day"07"number()

于 2008-10-16T19:15:55.230 回答
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 属性,以便您可以唯一地标识一个活动。

于 2008-10-16T18:44:02.503 回答
0

我认为你的结构适合你正在做的事情。

如果您打算部分使用它来了解 XML,您可能会考虑混合使用属性和元素,以便练习使用每个属性和元素的集合。一旦您对 XML 更加熟悉,您可能会开始定义规则,您将使用这些规则来确定哪些属性成为属性以及哪些属性成为元素。

使用正确的代码,您可以在 XML 文件和数据库表之间来回移动信息。您还可以开始学习XSL,以便练习在不更改原始 XML 文件的情况下移动事物(或者,一旦数据在表中,甚至没有原始 XML 文件)。

于 2008-10-16T18:51:44.513 回答
0

对于一些可能经过深思熟虑的想法,可能值得查看xCal ,它是iCalendar标准的 XML 兼容表示。

于 2008-10-16T19:11:42.400 回答