【问题标题】:SAXParseException - The entity "szlig" was referenced, but not declare. Error by XML validation?SAXParseException - 实体“szlig”被引用,但未声明。 XML验证错误?
【发布时间】:2017-03-27 03:25:17
【问题描述】:

请掌舵我。

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

谢谢。

【问题讨论】:

标签: java xml validation xerces


【解决方案1】:

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

这不会阻止您使用特殊字符。您可以通过三种方式在 XML 中使用非 ASCII 字符,例如 ß:

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

(b) 使用数字字符引用,例如ß

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

【讨论】:

  • 感谢您的回答,但我不能这样做。因为用户自己会加载一个字符串,这个字符串稍后会被验证并转换成 XML。
  • 我不确定这三个中的哪一个你不能(或为什么)。您必须选择其中之一,或者完全放弃使用 XML。
【解决方案2】:

尝试添加以下代码或将 ß 字符替换为 xml 中的 ß。这应该适合你。

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

一般解决方案

您可以使用引用 MathML DTD 的 DOCTYPE 声明或相同的本地副本:

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

此 DTD 包含所有实体引用。

【讨论】:

  • 谢谢,但我一般如何解决这个问题。要验证的字符串可以使用不同的语言。这意味着一旦出现一些特殊字符,验证器就不会工作。
  • 已更新答案,希望对您有所帮助。在mathml3.dtd 中,您可以看到&lt;!ENTITY % htmlmathmlent PUBLIC "-//W3C//ENTITIES HTML MathML Set//EN//XML" "htmlmathml-f.ent"&gt;,其中htmlmathml-f.ent 包含所有引用。
  • 谢谢。文件相当大。在文本验证时,您应该始终插入这一行。你能告诉我验证器是如何理解的,本地文件“htmlmathml-f.ent”在哪里?我有 Maven 项目。
  • 从此处here 下载 DTD 文件并将路径 http://www.w3.org/Math/DTD/mathml3/mathml3.dtd 更新为本地相对或绝对文件路径。如果你所有的文件都在同一个目录中,你可以写xhtml-math11-f-a.dtd它会查看同一个目录
  • 谢谢!理解。是否有任何文件的缩短版本,所以不是所有类型的字符,而只是那些真正属于字母表的字符。我希望只能通过文字进行良好的验证。每个字符串验证加上 400 kb,非常多。如果验证将是数百个,将执行什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多