【问题标题】:Ignoring DTD while parsing xml in java [duplicate]在java中解析xml时忽略DTD [重复]
【发布时间】:2013-07-29 07:19:10
【问题描述】:

我在xml下面处理:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE CASE SYSTEM "C:\Users\user123\Desktop\demo.dtd">
<INFO>
  <NAME>John Smith</NAME>
  <BUSINESSNAME>Smith</BUSINESSNAME>
</INFO>

但我不得不忽略

<!DOCTYPE CASE SYSTEM "C:\Users\user123\Desktop\demo.dtd"> because in presence of this parsing is giving error.

这是我的代码:

        StringBuilder sb = new StringBuilder();
        File xmlFile = new File("C:/Users/Desktop/demo.xml");

        BufferedReader br = new BufferedReader(new FileReader(xmlFile));
        String line = null;
        while((line = br.readLine())!= null){
            if(line.indexOf("&") != -1)
            {
                line = line.replaceAll("&","&amp;");
            }
                sb.append(line);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter(xmlFile));

        Source xmlInput = new StreamSource(new StringReader(sb.toString()));
        StringWriter stringWriter = new StringWriter();
        StreamResult xmlOutput = new StreamResult(stringWriter);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setAttribute("indent-number", 2);
        Transformer transformer = transformerFactory.newTransformer(); 
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(xmlInput, xmlOutput);


        bw.write(xmlOutput.getWriter().toString());
        bw.close();
        System.out.println("success");

有什么建议吗?

【问题讨论】:

  • removing that line from the file instead of ignoring it 的想法怎么样。
  • “解析出错”什么错误?还是 stackTrace?
  • @Prabhaker:xml 文件是动态创建的,我只需要解析 xml 即可保持内容完整。
  • @rahulserver : Error : java.io.FileNotFoundException: C:\Users\user123\Desktop\demo.dtd(系统找不到指定的路径)

标签: java xml-parsing doctype


【解决方案1】:

一种方法显然是从输入 xml 中删除它,但这是一种 hack,还有另一种方法可以让您删除它或从其他位置加载它。

秘诀是提供一个 XML 阅读器并指定一个实体解析器,它返回所需的 dtd 内容(一个空白字符串)。

代码如下:

public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        String path= "C:/Users/.../Desktop/demo.xml";
        File xmlFile = new File(path);
        String path2= "C:/Users/.../Desktop/demo2.xml";
        File xmlFile2 = new File(path2);

        BufferedReader br = new BufferedReader(new FileReader(xmlFile));
        String line = null;
        while((line = br.readLine())!= null){
            if(line.indexOf("&") != -1)
            {
                line = line.replaceAll("&","&amp;");
            }
            sb.append(line);
        }
        br.close();

        BufferedWriter bw = new BufferedWriter(new FileWriter(xmlFile2));

        StringWriter stringWriter = new StringWriter();
        StreamResult xmlOutput = new StreamResult(stringWriter);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setAttribute("indent-number", 2);
        Transformer transformer = null;
        try {
            transformer = transformerFactory.newTransformer();
            System.out.println(transformer.getOutputProperties());
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        try {
            XMLReader reader = XMLReaderFactory.createXMLReader();
            reader.setEntityResolver(new EntityResolver() {

                @Override
                public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
                    if (systemId.endsWith(".dtd")) {
                        StringReader stringInput = new StringReader(" ");
                        return new InputSource(stringInput);
                    }
                    else {
                        return null; // use default behavior
                    }
                }
            });
            SAXSource xmlSource = new SAXSource(reader, new InputSource(new StringReader(sb.toString())));
            transformer.transform(xmlSource, xmlOutput);
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }


        bw.write(xmlOutput.getWriter().toString());
        bw.close();
        System.out.println("success");
    }

您可以阅读this链接。

【讨论】:

  • -1 直接复制/粘贴链接而不引用。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2011-01-09
  • 2016-02-04
  • 2017-08-19
  • 2016-04-23
  • 2015-11-07
相关资源
最近更新 更多