ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在Java中解析和分析DTD文件?

2019-08-25 00:01:12  阅读:160  来源: 互联网

标签:java file parsing dtd


我想用Java实现一个程序,以便将DTD文件作为输入
并输出基于DTD的XML实例文件.

这意味着我必须在Java中解析和分析DTD文件.
是否有在线可用的API定义分析方法
DTD文件中的结构和元素?

谢谢

解决方法:

解析DTD的一个肮脏的解决方案是滥用Xerces内部.您可以将它作为可接受的东西的起点,因为它已在最近的JRE中可用,源代码可用(使用JDK或来自Apache),并且可以根据您的喜好进行修改(Apache许可证).请注意,对于具有外部实体等的真实DTD,您必须使用适配器配置XMLDTDLoader(例如setEntityResolver / Feature / Property).

这里有一些独立的代码可以试用(这对我来说似乎适用于OpenJDK 1.7.0和Oracle JDK 1.8.0):

import org.xml.sax.InputSource;
import com.sun.org.apache.xerces.internal.impl.dtd.DTDGrammar;
import com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDLoader;
import com.sun.org.apache.xerces.internal.util.SAXInputSource;
import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;

public class So26391485 {
    public static void main(String[] args) throws Exception {
        // minimal example DTD
        StringWriter sw = new StringWriter();
        sw.write("<!DOCTYPE html [");
        sw.write("  <!ELEMENT html (head, body)>");
        sw.write("  <!ELEMENT head (title)> <!ELEMENT title (#PCDATA)>");
        sw.write("  <!ELEMENT body (p+)> <!ELEMENT p (#PCDATA)>");
        sw.write("]>");

        // read DTD
        InputStream dtdStream = new ByteArrayInputStream(sw.toString().getBytes());
        //InputStream dtdStream = So26391485.class.getResourceAsStream("your.dtd");
        Scanner scanner = new Scanner(dtdStream);
        String dtdText = scanner.useDelimiter("\\z").next();
        scanner.close();

        // DIRTY: use Xerces internals to parse the DTD
        Pattern dtdPattern = Pattern.compile("^\\s*<!DOCTYPE\\s+(\\S+)\\s*\\[(.*)\\]>\\s*$", Pattern.DOTALL);
        Matcher m = dtdPattern.matcher(dtdText);
        if (m.matches()) {
            String docType = m.group(1);
            InputSource is = new InputSource(new StringReader(m.group(2)));
            XMLInputSource source = new SAXInputSource(is);
            XMLDTDLoader d = new XMLDTDLoader();
            DTDGrammar g = (DTDGrammar) d.loadGrammar(source);
            g.printElements();
        }
    }
}

(我不得不砍掉DOCTYPE声明,因为我没有设法让Xerces按原样读取DTD.毕竟XMLDTDLoader不是那样用的……)

标签:java,file,parsing,dtd
来源: https://codeday.me/bug/20190824/1713238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有