在DTD实体中使用诸如“+”之类的特殊字符

时间:2012-01-02 16:38:22

标签: xml dtd

我正在尝试定义一个值包含“+”字符的实体,但是如果我这样做,我会得到一个奇怪的错误消息。如果我删除+字符,一切正常。我似乎无法想办法逃避它。
我不仅使用我正在使用的库,而且还使用http://www.validome.org/grammar/validate/处的在线验证程序。 简短的样本:

<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY % Foo "BAR"> <!--No problem here-->
<!ENTITY % Baz "QUUX+QUUUX"> <!--This will cause trouble later on-->

<!ENTITY % FooBazType "( %Foo; | %Baz; )">

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName attributeName %FooBazType; #REQUIRED> <!--Here, you get the error message : The enumerated type list must end with ')' in the "attributeName" attribute declaration.-->

有人知道如何获得一个+字符(或者某些东西也能正确验证那个位置包含+字符的XML文档)吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

问题不在于实体本身,而在于它用于定义legal values are enumerated的属性。此类值必须与Nmtoken(一个或多个NameChar s)匹配。这不包括'+'和'$',它们不属于the definition of NameChar。以下示例说明了这一点。

plus.dtd:

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName 
          attributeName (BAR | FOO+BAZ) #REQUIRED>

plus.xml:

<tagName attributeName="FOO+BAZ"/>    
尝试针对plus.dtd验证plus.xml时的 xmllint输出:

xmllint --dtdvalid plus.dtd plus.xml 
<?xml version="1.0"?>
<tagName attributeName="FOO+BAZ"/>
plus.dtd:2: parser error : ')' required to finish ATTLIST enumeration
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
plus.dtd:2: parser error : Space required after the attribute type
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
plus.dtd:2: parser error : Content error in the external subset
<!ATTLIST tagName attributeName (BAR | FOO+BAZ) #REQUIRED>
                                          ^
Could not parse DTD plus.dtd

在固定属性值中使用“+”或“$”即可。

plus2.dtd:

<!ELEMENT tagName EMPTY>
<!ATTLIST tagName 
          attributeName CDATA #FIXED "FOO+$BAZ">

xmllint输出(无错误):

xmllint --dtdvalid plus2.dtd plus.xml 
<?xml version="1.0"?>
<tagName attributeName="FOO+$BAZ"/>