如何为此 XML 创建 dtd 规则?
How to create a dtd rule for this XML?
我需要创建一个不重复 XML 元素值的 dtd 规则,在本例中,我有一个包含 5 首歌曲(名称、艺术家、专辑...)的目录,并且name元素值不能重复,不能有两首歌同名,我这里的代码:
XML
<?xml version="1.0"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
<name>Bed of Roses</name>
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<coments>Good song</coments>
<path></path>
</song>
<song>
<name>Fly Away from here</name>
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<coments>Good song</coments>
<path></path>
</song>
</catalog>
DTD
<?xml version="1.0"?>
<!ELEMENT catalog (song)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT song (name)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
您可以 做的是在 name
元素上使用唯一 ID。不过,这只会让你走到一半; ID 必须是唯一的,但它不限制 name
.
中的 PCDATA
要解决这个问题,请创建文本实体来保存名称元素。您只能引用一次实体。如果您多次引用它,您将收到类似于以下内容的错误:
Attribute value "song1" of type ID must be unique within the document.
这将确保名称只被使用一次。
举个例子。 (您还有一些拼写错误导致您的 XML/DTD 无效。这些问题已得到修复。)
catalog.dtd
<!ELEMENT catalog (song+)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
id ID #REQUIRED>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
<!ELEMENT path (#PCDATA)>
<!ENTITY song1 '<name id="song1">Bed of Roses</name>'>
<!ENTITY song2 '<name id="song2">Fly Away from here</name>'>
XML
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
&song1;
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<comments>Good song</comments>
<path></path>
</song>
<song>
&song2;
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<comments>Good song</comments>
<path></path>
</song>
</catalog>
免责声明:我个人认为这是一个丑陋的 hack。正如 mzjn 在评论中所说,还有其他技术更适合确保这种类型的约束。
我需要创建一个不重复 XML 元素值的 dtd 规则,在本例中,我有一个包含 5 首歌曲(名称、艺术家、专辑...)的目录,并且name元素值不能重复,不能有两首歌同名,我这里的代码:
XML
<?xml version="1.0"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
<name>Bed of Roses</name>
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<coments>Good song</coments>
<path></path>
</song>
<song>
<name>Fly Away from here</name>
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<coments>Good song</coments>
<path></path>
</song>
</catalog>
DTD
<?xml version="1.0"?>
<!ELEMENT catalog (song)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT song (name)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
您可以 做的是在 name
元素上使用唯一 ID。不过,这只会让你走到一半; ID 必须是唯一的,但它不限制 name
.
要解决这个问题,请创建文本实体来保存名称元素。您只能引用一次实体。如果您多次引用它,您将收到类似于以下内容的错误:
Attribute value "song1" of type ID must be unique within the document.
这将确保名称只被使用一次。
举个例子。 (您还有一些拼写错误导致您的 XML/DTD 无效。这些问题已得到修复。)
catalog.dtd
<!ELEMENT catalog (song+)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
id ID #REQUIRED>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
<!ELEMENT path (#PCDATA)>
<!ENTITY song1 '<name id="song1">Bed of Roses</name>'>
<!ENTITY song2 '<name id="song2">Fly Away from here</name>'>
XML
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
&song1;
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<comments>Good song</comments>
<path></path>
</song>
<song>
&song2;
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<comments>Good song</comments>
<path></path>
</song>
</catalog>
免责声明:我个人认为这是一个丑陋的 hack。正如 mzjn 在评论中所说,还有其他技术更适合确保这种类型的约束。