20 package net.sf.gridarta.utils.xml;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.URISyntaxException;
26 import nu.xom.Builder;
27 import nu.xom.DocType;
28 import nu.xom.Document;
29 import nu.xom.ParsingException;
30 import nu.xom.xinclude.XIncludeException;
31 import nu.xom.xinclude.XIncluder;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34 import org.xml.sax.ErrorHandler;
35 import org.xml.sax.SAXException;
36 import org.xml.sax.XMLReader;
37 import org.xml.sax.helpers.XMLReaderFactory;
68 public static Document
readXmlUrl(@NotNull
final URL url, @NotNull
final String rootElement, @NotNull
final String systemId, @NotNull
final String resourceName, @Nullable
final ErrorHandler errorHandler)
throws IOException, ParsingException, SAXException, URISyntaxException, XIncludeException {
69 try (InputStream inputStream = url.openStream()) {
70 return readXmlStream(inputStream, url.toURI().toASCIIString(), rootElement, systemId, resourceName, errorHandler);
91 private static Document
readXmlStream(@NotNull
final InputStream inputStream, @NotNull
final String baseURI, @NotNull
final String rootElement, @NotNull
final String systemId, @NotNull
final String resourceName, @Nullable
final ErrorHandler errorHandler)
throws IOException, ParsingException, SAXException, XIncludeException {
92 final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
94 if (errorHandler !=
null) {
95 xmlReader.setErrorHandler(errorHandler);
97 final Builder builder =
new Builder(xmlReader,
true);
98 final Document document;
100 document = builder.build(in2, baseURI);
102 final DocType docType = document.getDocType();
103 if (docType ==
null) {
105 throw new AssertionError(
"document contains no DOCTYPE declaration");
107 final String documentSystemId = docType.getSystemID();
108 if (documentSystemId ==
null) {
109 throw new ParsingException(
"DOCTYPE declaration has no system ID; expecting '" + systemId +
"'");
111 if (!documentSystemId.equals(systemId)) {
112 throw new ParsingException(
"system ID in DOCTYPE declaration is '" + documentSystemId +
"'; expecting '" + systemId +
"'");
114 final String documentRootElement = docType.getRootElementName();
115 if (!documentRootElement.equals(rootElement)) {
116 throw new ParsingException(
"root element in DOCTYPE declaration is '" + documentRootElement +
"'; expecting '" + rootElement +
"'");
118 XIncluder.resolveInPlace(document, builder);