使用JDOM在Java中处理字符实体:如何?

时间:2013-09-18 09:06:09

标签: java xml entities

我要将xml文件转换为sgml文件。

我正在使用Java 1.6.0.31。和jDOM 2.0.5

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

我拥有xml(我的意思是我能够编辑xsd并使用此部分执行任何操作) XML的xsd没有声明这些实体,但是我使用的是允许插入这些实体的xml编辑器

我的问题是当我尝试转换包含这些权限的xml时,我得到了一个“& entities;引用但未声明的”异常消息。

代码是:

    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有γ格式实体然后用“全文”值替换数值?

感谢您的帮助!

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

1 个答案:

答案 0 :(得分:0)

Jeez,

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

在文档内部子集中插入了我需要的所有ENTITIES

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

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

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

我很惭愧,但就目前来说,它有用......

相关问题