Java/XML/EntityResolver
Содержание
- 1 Getting the Value of an Entity Reference in a DOM Document
- 2 implements EntityResolver
- 3 Intercepting All Accesses to External Entities During XML SAX Parsing
- 4 Preventing Expansion of Entity References While Parsing an XML File
- 5 Resolves an entity reference or character reference to its value.
- 6 Resolving entities found in source XML during parsing
Getting the Value of an Entity Reference in a DOM Document
<source lang="java">
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.rument; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.EntityReference; import org.w3c.dom.Text; public class Main {
public static void main(String[] argv) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); factory.setExpandEntityReferences(false); Document doc = factory.newDocumentBuilder().parse(new File("filename")); Element root = doc.getDocumentElement(); EntityReference eref = (EntityReference) root.getFirstChild(); Comment comment = (Comment) eref.getFirstChild(); Element elem = (Element) eref.getFirstChild().getNextSibling(); Text text = (Text) eref.getLastChild(); }
}
</source>
implements EntityResolver
<source lang="java">
import java.io.IOException; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class SimpleEntityResolver implements EntityResolver {
private static final String USAGE_TERMS_ID = "http://www.n.ru/t.xml"; private static final String USAGE_TERMS_LOCAL_URI = "C:\\t.xml"; public InputSource resolveEntity(String publicID, String systemID) throws IOException, SAXException { if (systemID.equals(USAGE_TERMS_ID)) { return new InputSource(USAGE_TERMS_LOCAL_URI); } return null; }
}
</source>
Intercepting All Accesses to External Entities During XML SAX Parsing
<source lang="java">
import java.io.File; import java.io.FileReader; import java.net.URI; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; public class Main {
public static void main(String[] argv) throws Exception { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); builder.setEntityResolver(new MyResolver()); Document doc = builder.parse(new File("infilename.xml")); }
} class MyResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) { try { URI uri = new URI(systemId); if ("file".equals(uri.getScheme())) { String filename = uri.getSchemeSpecificPart(); return new InputSource(new FileReader(filename)); } } catch (Exception e) { } return null; }
}
</source>
Preventing Expansion of Entity References While Parsing an XML File
<source lang="java">
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; public class Main {
public static void main(String[] argv) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); // Prevent expansion of entity references factory.setExpandEntityReferences(false); // Create the builder and parse the file Document doc = factory.newDocumentBuilder().parse(new File("filename")); }
}
</source>
Resolves an entity reference or character reference to its value.
<source lang="java">
/*
* Copyright Aduna (http://www.aduna-software.ru/) (c) 1997-2006. * * Licensed under the Aduna BSD-style license. */
public class Utils {
/** * Resolves an entity reference or character reference to its value. * * @param entName The "name" of the reference. This is the string between * & and ;, e.g. amp, quot, #65 or #x41. * @return The value of the supplied reference, or the reference itself * if it could not be resolved. */ public static String resolveEntity(String entName) { if (entName.startsWith("#")) { // character reference StringBuilder sb = new StringBuilder(); if (entName.charAt(1) == "x") { // Hex-notation sb.append((char)Integer.parseInt(entName.substring(2), 16)); } else { // Dec-notation sb.append((char)Integer.parseInt(entName.substring(1))); } return sb.toString(); } else if (entName.equals("apos")) { return """; } else if (entName.equals("quot")) { return "\""; } else if (entName.equals("gt")) { return ">"; } else if (entName.equals("lt")) { return "<"; } else if (entName.equals("amp")) { return "&"; } else { return entName; } }
}
</source>
Resolving entities found in source XML during parsing
<source lang="java">
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class Main {
public static void main(String[] argv) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); SAXParser parser = factory.newSAXParser(); SaxHandler handler = new SaxHandler(); parser.parse("sample.xml", handler); }
} class SaxHandler extends DefaultHandler {
public InputSource resolveEntity(String publicId, String systemId) { if (systemId.equals("http://www.my-company.ru/order-1.0.dtd")) { return new InputSource(getClass().getResourceAsStream("order.dtd")); } else { return null; } } public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (qName.equals("order")) { } } public void error(SAXParseException ex) throws SAXException { System.out.println("ERROR: [at " + ex.getLineNumber() + "] " + ex); } public void fatalError(SAXParseException ex) throws SAXException { System.out.println("FATAL_ERROR: [at " + ex.getLineNumber() + "] " + ex); } public void warning(SAXParseException ex) throws SAXException { System.out.println("WARNING: [at " + ex.getLineNumber() + "] " + ex); }
}
</source>