2016-11-13 62 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-但沒有聲明) –

+0

我認爲沒有。它不能解決我的問題.. – JDev

回答

0

嘗試添加下面的代碼或在您的xml中用ß替換ß字符。這應該適合你。

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

一般解

您可以使用DOCTYPE聲明,指的是相同的MathML DTD或本地副本:

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

這個DTD擁有所有的實體引用。

+0

謝謝,但我怎樣才能解決這個問題一般。要驗證的字符串可以使用不同的語言。這意味着驗證者只要有一些特殊字符就不會工作。 – JDev

+0

已經更新了答案,希望這會對你有所幫助。在'mathml3.dtd'中,你可以看到<!ENTITY%htmlmathmlent PUBLIC「 - // W3C // ENTITIES HTML MathML Set // EN // XML」「htmlmathml-f.ent」>'where [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)用一個實體引用,如&eszet;,確保該實體在DTD中聲明。

+0

感謝您的答覆,但我不能那樣做。因爲用戶自己會加載一個字符串,該字符串稍後將被驗證並轉換爲XML。 – JDev

+0

我不確定你不能做哪三項(或爲什麼)。您必須選擇其中之一,或完全放棄使用XML。 –