2012-01-02 2 views
3

값이 '+'문자를 포함하는 엔티티를 정의하려고하는데, 그렇게하면 줄 아래로 이상한 오류 메시지가 나타납니다. + 문자를 제거하면 모든 것이 정상적으로 작동합니다. 나는 그것을 벗어날 수있는 방법을 찾아 낼 수가 없다.
나는 라이브러리와 나는 현재뿐만 아니라 온라인 검사기와 http://www.validome.org/grammar/validate/ 짧은 샘플에서, 사용하고뿐만 아니라 오류가 발생합니다 :DTD 엔티티에서 '+'와 같은 특수 문자 사용하기

<?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 문서의 유효성을 올바르게 검사 할 것입니다). 미리 감사드립니다!

+0

그 기호가 유효가, 유니 코드 문자를 참조하려고 생각 하는가? – Joe

+1

내가 아는 한 멀쩡한데 숫자 이스케이프 시퀀스 (+)를 사용해 보았지만 그 중 하나도 작동하지 않았습니다. 더 많은 연구가 NMTOKEN (http://www.w3.org/TR/xml/#NT-Nmtoken)이라는 개념을 가져 왔고, 그것은 플러스를 배제하는 것처럼 보입니다 ... 내가 처음이라고 믿을 수는 없지만 + 캐릭터가 드문 경우가 아니므로이 문제와 관련된 사람이 있습니까? – user1126518

+0

'$'char (hex = 0x24)와 정확히 같은 문제가 있습니다. – Marek

답변

1

문제는 엔티티 자체가 아니며, legal values are enumerated이있는 속성을 정의하는 데 사용된다는 사실입니다. 이러한 값은 Nmtoken (하나 이상의 NameChar 초)과 일치해야합니다. 여기에는 the definition of NameChar의 일부가 아닌 '+'및 '$'이 제외됩니다. 아래 예제는 이것을 보여줍니다.

plus.dtd :

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

plus.xml :

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 

: plus.dtd에 대해 plus.xml을 확인하려고

<tagName attributeName="FOO+BAZ"/>  

xmllint가 출력 고정 된 속성 값에 '+'또는 '$'를 사용하면 문제가 없습니다.

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