1

我必须将 xml 文件转换为 sgml 文件。

我正在使用 Java 1.6.0.31。和 jDOM 2.0.5

我不拥有 sgml 的 DTD。DTD 声明了许多字符实体(如 γ , ω... 但我不允许使用 γ 实体形式)

我确实拥有 xml(我的意思是我可以编辑 xsd 并对这部分做任何我想做的事情) XML 的 xsd 没有声明这些实体,但我使用的是允许插入这些实体的 xml 编辑器

我的问题是,当我尝试转换包含这些实体的 xml 时,我收到“&entities; referenced but not declared”异常消息。

代码是:

    File sourceFile = new File(path);
    if (sourceFile.exists()) {
        DocumentBuilderFactory factory DocumentBuilderFactory.newInstance();

        factory.setExpandEntityReferences(false);
        factory.setValidating(false);
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(false);
        DOMBuilder builder = new DOMBuilder();

        this.xmlDocument = builder.build(factory.newDocumentBuilder().parse(sourceFile));

factory.newDocumentBuilder().parse() 是异常抛出者(显然)。

我一直在寻找答案,但我对 JDOM 还不够好,无法决定我应该做什么,所以我的问题是:在这种情况下,让实体解析最安全的做法是什么?

我应该创建一个可以完成这项工作的自定义 EntityResolver 吗?我是否应该强制输入的 xml 具有 γ 格式实体然后用“全文”值替换数值?

谢谢你的帮助 !

编辑:替换 & 所以你可以看到代码,而不是实体:/

4

1 回答 1

0

再说一次,

我已经结束了一些非常丑陋的事情:我已经使用filecontent.replaceFirst("<!DOCTYPE X \\[", "<!DOCTYPE X [" + getEntityFile());

function getEntityFile() {
return FileUtils.readFileToString(f);
}

其中 f 是包含我允许使用的所有字符实体的 DTD 文件(从 SGML DTD 复制)。所以我可以避免“引用但未声明的实体”。然后这些实体被替换(是的,我还没有找到不使用 jDOM2 替换内部实体的方法 => 如果有人有想法,我会带来啤酒)

最后,当我输出 SGML 文件时,我将值替换为实体引用...

我很惭愧,但现在,它工作......

于 2013-09-19T08:23:13.487 回答