2016-11-13 63 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。 –