2013-07-29 2 views
0

Я обработки ниже XML:Игнорирование DTD при разборе XML в 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 для прямой копии/вставки ссылки без цитирования. –

Смежные вопросы