有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我使用的是Java1.6.0.31。和jDOM 2.0.5

我没有sgml的DTD。 DTD声明了很多字符实体(比如&;gamma;、&;omega;……但是我不允许使用&;#947;实体表单)

我确实拥有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));

工厂。newDocumentBuilder()。parse()显然是异常抛出者

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

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

谢谢你的帮助

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


共 (1) 个答案

  1. # 1 楼答案

    天啊

    我最后做了一件非常丑陋的事: 我已经使用filecontent.replaceFirst("<!DOCTYPE X \\[", "<!DOCTYPE X [" + getEntityFile());在文档内部子集中插入了我需要的所有实体

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

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

    最后,当我输出SGML文件时,我用引用替换了这个值

    我很惭愧,但现在,它起作用了