繁体   English   中英

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

[英]Handling character entities in Java using JDOM : how to?

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

我正在使用Java 1.6.0.31。 和jDOM 2.0.5

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

我确实拥有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具有γ 格式实体,然后将数值替换为“全文”值?

谢谢你的帮助 !

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

真是的

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

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

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

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

我很ham愧,但是现在,它可以工作...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM