如何制作包含关系的XML文档?

时间:2010-01-26 09:56:27

标签: xml

好吧这听起来很傻,但我对XML并不是很熟悉。

我尝试做的是:

我有两个实体:公司员工。两个实体只有名称属性。

当我有两家公司,每家公司有两名员工时,XML文档会是什么样子?我可以简单地做这样的事吗? :

<?xml version="1.0"?>
  <company>
    <name>Apple</name>
    <employee>Steve</employee>
    <employee>Bill</employee>
  </company>
  <company>
    <name>Banana</name>
    <employee>John</employee>
    <employee>Luke</employee>
  </company>

这是好语法吗?或者我必须以不同的方式做到这一点?遗漏了什么重要的东西吗?

编辑为了进行比较,我从USGS(一个通过xml发布地震数据的地震观察机构)复制了一个有效的XML示例:

<?xml version="1.0"?>
<feed xml:base="http://earthquake.usgs.gov/" xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">
  <updated>2010-01-26T09:36:26Z</updated>
  <title>USGS M2.5+ Earthquakes</title>
  <subtitle>Real-time, worldwide earthquake list for the past day</subtitle>
  <link rel="self" href="/earthquakes/catalogs/1day-M2.5.xml"/>
  <link href="http://earthquake.usgs.gov/earthquakes/"/>
  <author><name>U.S. Geological Survey</name></author>
  <id>http://earthquake.usgs.gov/</id>
  <icon>/favicon.ico</icon>
  <entry><id>urn:earthquake-usgs-gov:us:2010ryav</id><title>M 5.2, southern Sumatra, Indonesia</title><updated>2010-01-26T06:53:25Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/us2010ryav.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/0_100.jpg" alt="0.343&#176;S 99.024&#176;E" align="left" hspace="20" /><p>Tuesday, January 26, 2010 06:53:25 UTC<br>Tuesday, January 26, 2010 01:53:25 PM at epicenter</p><p><strong>Depth</strong>: 58.50 km (36.35 mi)</p>]]></summary><georss:point>-0.3427 99.0242</georss:point><georss:elev>-58500</georss:elev><category label="Age" term="Past day"/></entry>


  <entry><id>urn:earthquake-usgs-gov:pr:p1002601</id><title>M 2.7, Puerto Rico region</title><updated>2010-01-26T04:14:07Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/prp1002601.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/20_-65.jpg" alt="19.102&#176;N 66.415&#176;W" align="left" hspace="20" /><p>Tuesday, January 26, 2010 04:14:07 UTC<br>Tuesday, January 26, 2010 12:14:07 AM at epicenter</p><p><strong>Depth</strong>: 13.80 km (8.57 mi)</p>]]></summary><georss:point>19.1017 -66.4150</georss:point><georss:elev>-13800</georss:elev><category label="Age" term="Past day"/></entry>


  <entry><id>urn:earthquake-usgs-gov:hv:00036408</id><title>M 3.0, Island of Hawaii, Hawaii</title><updated>2010-01-26T00:37:14Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/hv00036408.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/20_-155.jpg" alt="19.206&#176;N 155.517&#176;W" align="left" hspace="20" /><p>Tuesday, January 26, 2010 00:37:14 UTC<br>Monday, January 25, 2010 02:37:14 PM at epicenter</p><p><strong>Depth</strong>: 37.70 km (23.43 mi)</p>]]></summary><georss:point>19.2063 -155.5173</georss:point><georss:elev>-37700</georss:elev><category label="Age" term="Past day"/></entry>

</feed>

他们不使用像<entries>这样的根元素!而Apple的seismicXML示例可以很好地处理这个问题。奇怪...

4 个答案:

答案 0 :(得分:2)

您缺少根元素,例如:

<?xml version="1.0"?>
<companies>
    <company>...</company>
    <company>...</company>
</companies>

否则我认为这种结构适用于代表公司员工的一对多关系。


为了回复您发布的USGS Feed, 有一个根元素feed

答案 1 :(得分:1)

在将名称作为属性时,您也可以考虑合并上一个示例,如下所示:

<?xml version="1.0"?>
<companies>
    <company name="Apple">
        <employee>Steve</employee>
        <employee>Bill</employee>
    </company>
    <company name="Banana">
        <employee>John</employee>
        <employee>Luke</employee>
    </company>
</companies>

答案 2 :(得分:1)

XML并不是真正用于数据建模的。它是为数据序列化而制作的。最好使用ER图进行建模,并在确定数据模型后才考虑XML表示。

通常,当您的关系形成树时,您可以使用子元素对它们进行建模。 如果他们不这样做,您可能更愿意介绍某种类型的参考文献。例如,在这种情况下, 只要每个员工只与一家公司相关联,将员工元素纳入公司元素就足够了。但如果必须为多家公司列出同一名员工,您将开始复制数据。 为避免这种情况,包括从一个元素到另一个元素的引用可能是更可取的。

XML技术对引用有一些支持(例如,您可以使用ID和IDREF属性并验证它们与DTD的正确使用),但不是很多,并且它当然不告诉您如何以及在何处使用此类引用。< / p>

答案 3 :(得分:0)

您不应该依赖命名。您应该给每个员工一个id(公司也是如此)。因为否则你不能拥有两个名字相同的员工。

示例:

<data>
    <company id="0">
      <name>Apple</name>
      <employee>0</employee>
      <employee>1</employee>
    </company>
    <company id="1">
      <name>Banana</name>
      <employee>2</employee>
      <employee>3</employee>
    </company>
    <employee id="0" name="Steve"/>
    <employee id="1" name="Bill"/>
    <employee id="2" name="John"/>
    <employee id="3" name="Luke"/>
  </data>