SAXParseException - 引用了实体“szlig”,但未声明。 XML验证错误?

时间:2016-11-13 10:09:01

标签: java xml validation xerces

请告诉我。

我有验证的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;
}

感谢。

2 个答案:

答案 0 :(得分:0)

尝试添加以下代码或将x字符替换为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具有所有实体引用。

答案 1 :(得分:0)

在XML中预先声明的唯一实体是lt,gt,amp,quot和apos。如果您使用任何其他实体名称,则必须声明它。

这并不会阻止您使用特殊字符。有三种方法可以使用非ASCII字符,例如XML中的ß:

(a)直接输入字符(确保编辑器配置为使用与XML声明中声明的编码匹配的字符编码)。

(b)使用数字字符引用,例如&#223;

(c)使用&eszet;之类的实体引用,确保在DTD中声明该实体。