好吧这听起来很傻,但我对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°S 99.024°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°N 66.415°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°N 155.517°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示例可以很好地处理这个问题。奇怪...
答案 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>