2013-07-29 21 views
0

我處理下面的XML解析XML:忽略DTD而在Java

<?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"); 

有什麼建議?

+0

「從文件中刪除該行而不是忽略它」的想法如何。 – Prabhaker

+0

「解析發生錯誤」是什麼錯誤?或stackTrace? – rahulserver

+0

@ Prabhaker:xml文件是動態創建的,我需要解析xml保持內容不變。 – Aquarius24

回答

0

一種方法顯然只是將其從輸入xml中刪除,但這是一種黑客攻擊,還有另一種方法可以將其從另一個位置刪除或加載。

祕訣是提供一個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鏈接。

+0

-1用於直接複製/粘貼鏈接而不引用。 –