使用本地 DTD 验证 XML,抛出错误
Validating the XML with local DTD, throws error
我正在尝试使用本地 DTD 验证我的 XML,我对此做了 google 然后我得到了一些代码,这是我的代码。
public Document buildDocument(File receivedFile) {
Document doc = null;
try {
logger.info("Inside buildDocument() , create a new DocumentBuilderFactory");
// create a new DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
// use the factory to create a documentbuilder
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new ErrorHandler() {
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.err.println("fatalError: " + exception);
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.err.println("error: " + exception);
}
@Override
public void warning(SAXParseException exception) throws SAXException {
System.err.println("warning: " + exception);
}
});
builder.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains("xyz.com/remote.dtd")) {
return new InputSource(FileUtils.readFileToString(
new File("C:\Users\xyz\local.dtd"));
} else {
return null;
}
}
});
doc = builder.parse(new InputSource(new StringReader(FileUtils.readFileToString(receivedFile, "UTF-16"))));
} catch (ParserConfigurationException | SAXException | IOException e) {
logger.warn("Opps got error while buiding document", e);
}
return doc;
我收到以下错误,我确信本地 DTD 可以与我尝试验证的 XML 一起正常工作。我没有发现 DTD 有任何问题,但我仍然收到此错误,请帮助解决这个问题。
> java.net.MalformedURLException: no protocol: <!DOCTYPE ichicsr [
> <!ENTITY lt "&#60;">
>
> <!-- Greater Than ">" --> <!ENTITY gt ">">
>
> <!-- Ampersand "&" --> <!ENTITY amp "&#38;">
然后打印整个 DTD!
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:964)
at org.apache.xerces.impl.XMLEntityManager.startEntity(XMLEntityManager.java:902)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:869)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:241)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(XMLDocumentScannerImpl.java:1001)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:324)
at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:875)
at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:798)
at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:108)
at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:230)
NOTE : My XML is encoded type UTF-16
更新:读取文件时删除了 UF-16,看起来 DTD 正在尝试进行编译,但它抛出以下错误,
latin-entities.dtd (The system cannot find the path specified)
这是否意味着这个 DTD 正在寻找依赖的 DTD ??
我猜问题出在这里:
if (systemId.contains("xyz.com/remote.dtd")) {
return new InputSource(FileUtils.readFileToString(
new File("C:\Users\xyz\local.dtd"));
这里假设FileUtils.readFileToString()
returns文件内容为
细绳。
XMLEntityManager 期望 InputSource 提供系统 ID 作为 URL,但它会获取文件内容,因此出现格式错误URL异常。
要么根据文件URL创建一个InputSource
new InputSource(new File(...).toURI().toASCIIString()
或者在文件内容上使用 StringReader 创建 InputSource
new InputSource(new StringReader(FileUtils....))
我正在尝试使用本地 DTD 验证我的 XML,我对此做了 google 然后我得到了一些代码,这是我的代码。
public Document buildDocument(File receivedFile) {
Document doc = null;
try {
logger.info("Inside buildDocument() , create a new DocumentBuilderFactory");
// create a new DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
// use the factory to create a documentbuilder
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new ErrorHandler() {
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.err.println("fatalError: " + exception);
}
@Override
public void error(SAXParseException exception) throws SAXException {
System.err.println("error: " + exception);
}
@Override
public void warning(SAXParseException exception) throws SAXException {
System.err.println("warning: " + exception);
}
});
builder.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if (systemId.contains("xyz.com/remote.dtd")) {
return new InputSource(FileUtils.readFileToString(
new File("C:\Users\xyz\local.dtd"));
} else {
return null;
}
}
});
doc = builder.parse(new InputSource(new StringReader(FileUtils.readFileToString(receivedFile, "UTF-16"))));
} catch (ParserConfigurationException | SAXException | IOException e) {
logger.warn("Opps got error while buiding document", e);
}
return doc;
我收到以下错误,我确信本地 DTD 可以与我尝试验证的 XML 一起正常工作。我没有发现 DTD 有任何问题,但我仍然收到此错误,请帮助解决这个问题。
> java.net.MalformedURLException: no protocol: <!DOCTYPE ichicsr [
> <!ENTITY lt "&#60;">
>
> <!-- Greater Than ">" --> <!ENTITY gt ">">
>
> <!-- Ampersand "&" --> <!ENTITY amp "&#38;">
然后打印整个 DTD!
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:964)
at org.apache.xerces.impl.XMLEntityManager.startEntity(XMLEntityManager.java:902)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:869)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:241)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(XMLDocumentScannerImpl.java:1001)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:324)
at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:875)
at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:798)
at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:108)
at org.apache.xerces.parsers.DOMParser.parse(DOMParser.java:230)
NOTE : My XML is encoded type UTF-16
更新:读取文件时删除了 UF-16,看起来 DTD 正在尝试进行编译,但它抛出以下错误,
latin-entities.dtd (The system cannot find the path specified)
这是否意味着这个 DTD 正在寻找依赖的 DTD ??
我猜问题出在这里:
if (systemId.contains("xyz.com/remote.dtd")) {
return new InputSource(FileUtils.readFileToString(
new File("C:\Users\xyz\local.dtd"));
这里假设FileUtils.readFileToString()
returns文件内容为
细绳。
XMLEntityManager 期望 InputSource 提供系统 ID 作为 URL,但它会获取文件内容,因此出现格式错误URL异常。
要么根据文件URL创建一个InputSource
new InputSource(new File(...).toURI().toASCIIString()
或者在文件内容上使用 StringReader 创建 InputSource
new InputSource(new StringReader(FileUtils....))