/** * Advanced users only; use loadXML() in PApplet. * * <p>Added extra code to handle \u2028 (Unicode NLF), which is sometimes inserted by web browsers * (Safari?) and not distinguishable from a "real" LF (or CRLF) in some text editors (i.e. * TextEdit on OS X). Only doing this for XML (and not all Reader objects) because LFs are * essential. https://github.com/processing/processing/issues/2100 * * @nowebref */ public XML(final Reader reader, String options) throws IOException, ParserConfigurationException, SAXException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // Prevent 503 errors from www.w3.org try { factory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); } catch (IllegalArgumentException e) { // ignore this; Android doesn't like it } // without a validating DTD, this doesn't do anything since it doesn't know what is ignorable // factory.setIgnoringElementContentWhitespace(true); factory.setExpandEntityReferences(false); // factory.setExpandEntityReferences(true); // factory.setCoalescing(true); // builderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = factory.newDocumentBuilder(); // builder.setEntityResolver() // SAXParserFactory spf = SAXParserFactory.newInstance(); // spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // SAXParser p = spf.newSAXParser(); // builder = DocumentBuilderFactory.newDocumentBuilder(); // builder = new SAXBuilder(); // builder.setValidation(validating); Document document = builder.parse( new InputSource( new Reader() { @Override public int read(char[] cbuf, int off, int len) throws IOException { int count = reader.read(cbuf, off, len); for (int i = 0; i < count; i++) { if (cbuf[off + i] == '\u2028') { cbuf[off + i] = '\n'; } } return count; } @Override public void close() throws IOException { reader.close(); } })); node = document.getDocumentElement(); }
/** * Unlike the loadXML() method in PApplet, this version works with files that are not in UTF-8 * format. * * @nowebref */ public XML(InputStream input, String options) throws IOException, ParserConfigurationException, SAXException { // this(PApplet.createReader(input), options); // won't handle non-UTF8 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // Prevent 503 errors from www.w3.org factory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); } catch (IllegalArgumentException e) { // ignore this; Android doesn't like it } factory.setExpandEntityReferences(false); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new InputSource(input)); node = document.getDocumentElement(); }