这是有效的XML吗?

时间:2009-12-18 16:42:35

标签: xml tree logic structure

我知道语法是有效的,但我的问题是它是否在逻辑上有效:

<parent>
    <name>John</name>
    <child>Mary</child>
    <child>Lucy</child>
    <child>Hannah</child>
</parent>

或正确的方法是:

<parent>
    <name>John</name>
    <child>
        <name>Mary</name>
    </child>
    <child>
        <name>Lucy</name>
    </child>
    <child>
        <name>Hannah</name>
    </child>
</parent>

网上是否有一些文件明确说出了什么是对错?

10 个答案:

答案 0 :(得分:15)

我更喜欢后者,因为它清楚地表明它是玛丽的孩子的名字,而不是玛丽的孩子自己。

我认为使用属性会更好,就像这样:

<parent name="John">
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
</parent>

因为它清楚地表明该名称只是父/子实体的一个特征。

答案 1 :(得分:6)

从可扩展性的角度来看,第二个似乎更有意义。如果您需要为第一个孩子添加生日,会发生什么?是的,你可以添加一个XML属性,但迟早会因为添加复杂类型甚至是基本枚举而陷入困境。

此外 - 将子元素分组在一个“子元素”下可能更好:

<parent>
    <name>John</name>
    <children>
      <child>
        <name>Mary</name>
        <dob>1970-01-01</dob>
      </child>
      <child>
        <name>Lucy</name>
        <dob>1971-01-01</dob>
      </child>
      <child>
        <name>Hannah</name>
        <dob>1974-01-01</dob>
      </child>
    <children>
</parent>

还有一件事:你可能不会将这些孩子归为一个单一的父元素,但我已经将其与你的原始元素保持一致。

答案 2 :(得分:5)

这取决于你将如何处理它。如果您将来有可能需要存储关于每个人的更多数据,那么第二个版本会更好。

答案 3 :(得分:2)

第二个是可取的。这清楚地表明name是孩子的属性,并不识别孩子自己。

从课程方面考虑:

class Parent {
    string Name;
    List<Child> Children;
}

class Child {
    string Name;
}

优于

class Parent {
    string Name; 
    List<string> Children;
}

第二个选项还为您提供了将来扩展的灵活性(例如,添加生日元素)。

更主观的争论是,是否对name等属性使用元素或属性。

最后,添加一个children元素,其中包含child个元素。

答案 4 :(得分:2)

当然,这个问题没有正确的答案,但如果孩子比单个文本字符串更复杂(或者可能变得更复杂),那么第二个选项更可取。

就您通常看到的情况而言,通常在任何一种情况下,所有子元素都将分组在子元素下。在某些可视化环境中,它可以帮助关闭所有孩子,而其他元素保持焦点。

答案 5 :(得分:2)

我会使用Shoko和DanDan或Wim Hollebrandse之间的替代方案:

<parent name="John">
  <children>
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
  </children>
</parent>

因为我喜欢孩子的“集合”,实际上是孩子。

答案 6 :(得分:1)

是XML,没有对错。你的答案都是正确的,但这同样有效:

<parent>
  <name>John</name>
  <children>
    <child>Mary</child>
    <child>Lucy</child>
    <child>Hannah</child>
  </children>
</parent>

您应该选择哪种方式?这取决于任务。我不认为提出的任何方式都是最灵活的(如果孩子有孩子会怎么样?)

答案 7 :(得分:1)

两者都是对的。关于如何构建元素没有定义 - 这完全取决于你!

有些人试图减少节点数量。那些人可能会创建像

这样的xml
<parent name="John">
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
</parent>

但是关于XML的线索是,你应该总是尽可能轻松地阅读和理解人类。拧动这些comupters,他们将永远了解你的XML,所以让它变得人性化!

答案 8 :(得分:1)

没有关于如何将数据映射到XML Schema的标准。有一些常见的做法,其中一种是使用striped XML,所以嵌套元素交替采用类型/关系/类型/关系角色:

<!-- striped style, RDF etc -->
<person>
    <name>John</name>
    <children>
        <person>
            <name>Mary</name>
        </person>
        <person>
            <name>Lucy</name>
        </person>
        <person>
            <name>Hannah</name>
        </person>
    <children>
</parent>

这是非常规律的,但有点冗长。

将人类可读文本放入属性以节省空间通常是个坏主意:

<person name="fred"/>

因为这排除了使用某些形式的国际化所必需的ruby mark up,以及使用CSS渲染更复杂。如果您只关心压缩表示和ASCII文本,那么XML可能不是最适合使用的格式。

答案 9 :(得分:1)

值得一提的是,“有效”一词在XML中具有特定含义。

当且仅当XML文档符合其DTD或模式时,XML文档才有效。基本上,文本字符串的范围分为两类:格式良好的XML和非格式的XML。格式良好的XML文档也分为三类:有效的XML文档(符合其DTD /模式),无效的XML文档(没有),以及那些有效性无法确定的文档(因为它们不是'有一个DTD /架构。)

就您的实际问题而言,您只能根据XML文档的使用目的来判断XML文档的设计。你打算用XSLT改造吗?用XPath查询它?使用Linq-to-XML处理它?用SAX读卡器处理它?将其中的数据反序列化为对象?在记事本中编辑它?根据模式验证它?通过慢速网络传输?所有这些事情(还有更多)都应该影响XML的设计。没有一个正确的答案。