Ignoring DTD when parsing XML

后端 未结 2 1438
Happy的楠姐
Happy的楠姐 2021-01-17 17:17

How can I ignore the DTD declaration when parsing file with XOM xml library. My file has the following line :




        
相关标签:
2条回答
  • 2021-01-17 17:43

    According to their documentation this is the way to parse document without any validation.

    try {
      Builder parser = new Builder();
      Document doc = parser.build("http://www.cafeconleche.org/");
    }
    catch (ParsingException ex) {
      System.err.println("Cafe con Leche is malformed today. How embarrassing!");
    }
    catch (IOException ex) {
      System.err.println("Could not connect to Cafe con Leche. The site may be down.");
    }
    

    If you do want to validate XML schema you have to call new Builder(true):

    try {
      Builder parser = new Builder(true);
      Document doc = parser.build("http://www.cafeconleche.org/");
    }
    catch (ValidityException ex) {
      System.err.println("Cafe con Leche is invalid today. (Somewhat embarrassing.)");
    }
    catch (ParsingException ex) {
      System.err.println("Cafe con Leche is malformed today. (How embarrassing!)");
    }
    catch (IOException ex) {
      System.err.println("Could not connect to Cafe con Leche. The site may be down.");
    }
    

    Pay attention that now yet another exception can be thrown: ValidityException

    0 讨论(0)
  • 2021-01-17 17:46

    The preferred solution would be to implement an EntityResolver that intercepts requests for the DTD and redirects these to an embedded copy. If you

    1. don't have access to the DTD and
    2. are absolutely sure you won't need it (apart from validation it might also declare character entities that are used in the document) and
    3. you are using the Xerces XML Parser implementation

    you can disable fetching of DTD by setting the corresponding SAX feature. In XOM this should be possible by passing an XMLReader to the Builder constructor like this:

    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLReaderFactory;
    
    ...
    
    XMLReader xmlreader = XMLReaderFactory.createXMLReader();
    xmlreader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    Builder builder = new Builder(xmlreader);
    
    0 讨论(0)
提交回复
热议问题