2016-11-13 10 views
1

제발 도와주세요.SAXParseException - "szlig"엔티티가 참조되었지만 선언되지 않았습니다. XML 유효성 검사 오류가 있습니까?

나는 유효성을 검사하는 XML 문자열이 있습니다. 때로는 문서가 유효성 검사를 통과하지 못합니다. 단어 "Weiß"가 있기 때문입니다. 이 오류 및 기타 유사한 오류를 수정하는 방법은 무엇입니까? 나는 그 편지에 맹세 한 것을 이해합니다 "ß". 그러나 이상한 행동, 최초의 오류 던진,하지만 두 번째 시간, 같은 라인은 이미 유효합니다. 저는 xerces 라이브러리를 사용합니다.

org.xml.sax.SAXParseException; lineNumber: 19; columnNumber: 17; The entity "szlig" was referenced, but not declare 

검증

SchemaFactory factory = new XMLSchemaFactory(); 

try { 
    InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(WTConstants.XSD_VALIDATOR); 

    if (xmlString.startsWith("\uFEFF")) { 
    xmlString = xmlString.substring(1);// remove BOM 
    } 

    Schema schema = factory.newSchema(new StreamSource(stream)); 
    Validator validator = schema.newValidator(); 
    validator.validate(new StreamSource(new StringReader(xmlString))); 
} catch (SAXException | IOException e) { 
    logger.error("Validation error: ", e); 
    isXmlValid = false; 
} 

감사합니다.

+0

가능한 복제본 [http://stackoverflow.com/questions/15858914/entity-was-referenced-but-not-declared](http://stackoverflow.com/questions/15858914/entity-was-referenced- but-not-declared) –

+0

나는 생각하지 않는다. 내 문제는 해결되지 않습니다. – JDev

답변

0

아래 코드를 추가하거나 x 문자로 ß 문자를 ß으로 대체하십시오. 이것은 당신을 위해 작동해야합니다.

<!DOCTYPE math 
    PUBLIC "-//W3C//DTD MathML 3.0//EN" 
      "http://www.w3.org/Math/DTD/mathml3/mathml3.dtd"> 

이 DTD는 모든 엔티티 참조가 :

<!DOCTYPE definition [ 
<!ENTITY szlig "&#223;"> 
]> 

일반 솔루션

동일한의 MathML DTD 또는 로컬 복사본을 참조하는 DOCTYPE 선언을 사용할 수 있습니다.

+0

고맙습니다.하지만이 문제는 일반적으로 어떻게 해결할 수 있습니까? 유효성을 검사 할 문자열은 다른 언어 일 수 있습니다. 즉, 유효성 검사기가 특수 문자가 나오는대로 작동하지 않습니다. – JDev

+0

답변을 업데이트했습니다. 도움이되기를 바랍니다. 'mathml3.dtd'에서''[htmlmathml-f. ent] (http://www.w3.org/2003/entities/2007/htmlmathml-f.ent)에는 모든 참고 문헌이 들어 있습니다. –

+0

감사합니다. 파일이 상당히 큽니다. 텍스트 유효성 검사시 항상이 줄을 삽입해야합니다. 유효성 검사기가 이해하는 방법을 알려주십시오. "htmlmathml-f.ent"로컬 파일은 어디에 있습니까? 나는 Maven 프로젝트를 가지고있다. – JDev

0

XML에서 미리 선언 된 엔티티는 lt, gt, amp, quot 및 apos입니다. 다른 엔티티 이름을 사용하는 경우이를 선언해야합니다.

이렇게해도 특수 문자 사용이 중단되지 않습니다. XML에서 ß와 같은 비 ASCII 문자를 사용할 수있는 세 가지 방법이 있습니다.

(a) 문자를 직접 입력하십시오 (편집기가 XML 선언).

(b)는 &#223;

(c)는 기업이 DTD에 선언되어 있는지 확인하고, 같은 &eszet; 같은 엔티티 참조를 사용하여 같은 숫자 문자 참조를 사용합니다.

+0

답변을 주셔서 감사합니다.하지만 그럴 수는 없습니다. 사용자 자신이 문자열을로드하므로 나중에 XML로 유효성이 검사되고 변환됩니다. – JDev

+0

나는 당신이 할 수없는 세 가지 (또는 왜)가 확실하지 않습니다. 그 중 하나를 선택하거나 XML 사용을 완전히 포기해야합니다. –