2009-12-18 115 views
2

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

<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> 

有一些文档在线那肯定说什么是对的和错的?

+4

在线或其他地方没有定义任何随机XML文档的语义的文档。也没有一种“正确”的方式来做到这一点。这一切都取决于存储的具体数据,未来的扩展性要求,预期的典型处理等。 – 2009-12-18 16:50:58

+0

@Pavel,你为什么不把它写成答案?我一定会对它投票。 – 2009-12-18 17:52:12

回答

1

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

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

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

5

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

+1

所以,你是说这两种方式都是有效的,但第二应该是首选? – 2009-12-18 16:50:22

+0

如果您的数据存储需求不会改变,那么第一个选项可以正常工作。第二个选项更加灵活,所以它可能会更好,因为您的数据在将来几乎总是需要更改。 – David 2009-12-18 17:05:06

15

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

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

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

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

+1

我更喜欢这个,因为否则父母的名字与他们的孩子具有相同的逻辑权重。 – Skilldrick 2009-12-18 16:48:35

+3

+1,用于暗示使XML更臃肿:) – OregonGhost 2009-12-18 16:49:06

+0

我已经看到过去在某些应用程序中解析XML,而不像元素没有文本节点。他们认为它是非标准的(我认为SAP就是这样 - 我不知道它是否仍然存在),所以如果没有文本节点的重要元素有时可以被视为空标签,即使它具有属性。所以这个解决方案使得XML不那么臃肿,但可能不适合所有情况。 – Yishai 2009-12-18 16:51:48

2

第二个是可取的。这表明,name是一个孩子的财产,并没有识别孩子iteself。在类的术语它

想:

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

class Child { 
    string Name; 
} 

最好

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

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

更主观争论是是否使用元件或像name性能属性等

最后,添加一个children元件与包含在那里的child元件。

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> 

一两件事:你可能不会组一个单亲元素下的孩子,但我已经离开了你的原版。

+0

我不会因为没有用ISO8602格式表示你的日期而让你失望,但我应该。 – 2009-12-18 18:40:30

+0

我在想那个,但不能打扰。真实的故事。 – 2009-12-18 18:46:37

+0

编辑为符合罗伯特。 ;-) – 2009-12-18 18:50:38

1

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

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

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

2

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

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

1

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

有些人试图减少节点的数量。而那些人,也许会创建XML像

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

但是关于XML的线索是,你应该总是让它为伊斯利地阅读和理解,为人类beeings。拧上comupters,他们会一直了解你的XML,所以让它成为人类可读的!因为我喜欢孩子这实际上是孩子们的“设置”

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

+0

属性是XML信息集中的一个节点。 – 2009-12-18 17:21:18

2

我会用祥子和丹丹或维姆Hollebrandse之间的替代品。

1

对于如何将数据映射到XML模式没有标准。有一些常见的做法,其中之一是使用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可能不是要使用的最佳格式。