java解析xml檔案讀取本地dtd或者忽略dtd
Java程式在解析xml檔案時,如果xml檔案中指定了dtd,在預設會從指定的url下載dtd檔案,但是很多情況下如果網路連線不上,或者防火牆原因,dtd檔案無法下載下來導致程式報連線超時異常,解析xml失敗。有兩種方法解決該類問題:
1.指定從本地讀取dtd檔案
若要解析的xml檔案中有如下的dtd宣告:。
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
publicId:被引用的外部實體的公共識別符號,如果未提供,則為 null。
上述的dtd宣告中publicId為-//OASIS//DTD DITA Concept//EN
systemId:被引用的外部實體的系統識別符號。
上述的dtd宣告中systemId為http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd
可以通過重新SAX的EntityResolver類的resolveEntity(String publicId, String systemId)
throws SAXException, IOException
/**
* Implementation of <code>org.xml.sax.EntityResolver</code> that loads
* entitities (for example dtd files) from the classpath.
*/
public class ClasspathEntityResolver
implements EntityResolver
{
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException
{
if (systemId != null)
{
int index = systemId.lastIndexOf('/');
if (index != -1)
{
systemId = systemId.substring(index + 1);
}
systemId = "/" + systemId;
InputStream istr = Thread.currentThread().getContextClassLoader().getResourceAsStream(systemId);
if (istr != null)
{
return new InputSource(istr);
}
}
return null;
}
}
在SAX解析xml檔案之前,指定使用自定義的ClasspathEntityResolver:
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
xmlReader = saxParser.getXMLReader();
xmlReader.setEntityResolver(new ClasspathEntityResolver());
xmlReader.setContentHandler(handler);
try {
xmlReader.parse(new InputSource(inputFilePath));
} catch (Exception e) {
e.printStackTrace();
}
注意:
經常測試發現,這種方法只對SYSTEM(本地dtd)有效,如:<!DOCTYPE concept SYSTEM "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
但是對於PUBLIC(外部dtd)不起作用,如:
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "http://docs.oasis-open.org/dita/v1.2/os/dtd1.2/technicalContent/dtd/concept.dtd">
PUBLIC方式的dtd依然從外部下載dtd,只能通過第二種方式忽略dtd校驗。
2.解析xml檔案時徹底忽略dtd:
SAX解析器可以通過指定http://apache.org/xml/features/nonvalidating/load-external-dtd屬性來確定是否忽略dtd,例子如下:
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
xmlReader = saxParser.getXMLReader();
xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
xmlReader.setContentHandler(handler);
try {
xmlReader.parse(new InputSource(inputFilePath));
} catch (Exception e) {
e.printStackTrace();
}
這樣指定之後,解析xml檔案時,不再進行dtd校驗。
相關推薦
java解析xml檔案讀取本地dtd或者忽略dtd
Java程式在解析xml檔案時,如果xml檔案中指定了dtd,在預設會從指定的url下載dtd檔案,但是很多情況下如果網路連線不上,或者防火牆原因,dtd檔案無法下載下來導致程式報連線超時異常,解析xml失敗。有兩種方法解決該類問題: 1.指定從本地讀取dtd檔案 若要解析
java解析xml檔案:建立、讀取、遍歷、增刪查改、儲存
全棧工程師開發手冊 (作者:欒鵬) java使用JDOM介面解析xml檔案,包含建立、增刪查改、儲存,讀取等操作。 需要引入jdom.jar,下載 xercesImpl.jar
Java解析xml檔案的方式
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; impo
Java解析XML檔案的常用方法介紹
1 import java.io.IOException; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 import javax.x
Java解析xml檔案遇到“unknown protocol: c Nested exception: unknown protocol: c”問題的解決辦法
在寫畢設的時候在解析XML檔案的時候遇到的一個棘手的問題“unknown protocol: c Nested exception: unknown protocol: c”,翻閱了資料說是tomcat的安裝路徑不能有空格,要麼重新安裝tomcat,要麼以檔案的形式進行解析,
Java解析xml檔案之增刪改查
XML是什麼: 可擴充套件的標記語言 XML能幹什麼: 描述資料、儲存資料、傳輸(交換)資料。 XML文件節點型別: u 文件(document) u 元素(element) u 屬性(attribu
Java解析XML檔案的四種方式
1 import javax.xml.parsers.SAXParser; 2 import javax.xml.parsers.SAXParserFactory; 3 4 import org.xml.sax.Attributes; 5 import org.xml.sax
java解析xml檔案四種方式
1.介紹 1)DOM(JAXP Crimson解析器) DOM是用與平臺和語言無關的方式表示XML文件的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文件和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而
java 解析xml檔案
一、SAX:基於事件流的解析優點:不用事先調入整個文件,佔用資源少;SAX解析器程式碼比DOM解析器程式碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒儲存資料,那麼資料就丟了;無狀態性;從事件中只能得到文字,但不知該文字屬於哪個元素;使用場合:Applet;只
Java解析xml檔案的方法
什麼是 XML? XML指可擴充套件標記語言(EXtensible Markup Language)XML 是一種標記語言,很類似 HTMLXML 的設計宗旨是傳輸資料,而非顯示資料XML 標籤沒有被預定義。您需要自行定義標籤。XML 被設計為具有自我描述性。XML 是
使用Java解析XML檔案或XML字串的例子
本文由Markdown語法編輯器編輯完成。 經驗與教訓: 因為是Java專案,未載入特定的jar包,而導致在解析XML檔案和字串時,發生了ClassNotFoundException。 在使
【Java】XML檔案讀取到資料庫
xml檔案讀取到資料庫 第一步,導包 c3p0,dom4j,jaxen,MySQL-connector 第二步 xml檔案,config檔案 第三步 javabean 第四步 c3p0的工具類 第五步 讀取xml檔案 SAXReader中的xpath的方式 首先需要m
Java解析xml檔案的4種方式
java解析xml分為兩類,4種,分別為SAX解析,dom解析,jdom,dom4j.以下具體舉例使用4種方式來實現對一個.xml檔案進行解析: 有命名為dome.xml的檔案, <?xml version="1.0" encoding="UTF-8"?> &l
java w3c解析xml檔案,獲取指定節點內容,讀取外部配置檔案。
原始碼: package com.ys.adage.utils; import com.ys.adage.message.CodeObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.
Java眼中的XML---檔案讀取(二)SAX解析XML檔案
目錄 (一)SAX解析是什麼? (二)SAX解析和DOM解析的區別? (三)SAX方法解析XML的步驟 (四)SAX解析Java程式碼實現 (一)SAX解析是什麼? SAX(simple API for XML)是一種XML解析的
Java眼中的XML---檔案讀取(一)DOM解析XML檔案
目錄 (一)什麼是XML? (二)XML的作用 (三)DOM解析XML檔案的準備工作 (四)使用DOM解析XML檔案的屬性名和屬性值 (五)使用DOM解析XML檔案的節點名和節點值 (一)什麼是XML? XML 指可
Java上傳且後臺解析XML檔案
後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.
java對於xml檔案的四種解析方式
概述 XML是一種通用的資料交換格式,它的平臺無關性、語言無關性、系統無關性、給資料整合與互動帶來了極大的方便。XML在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。 XML的解析方式分為四種:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中
java後臺解析XML檔案
解析XML檔案分為兩種: 1、DOM(Document Object Model) 2、SAX(Simple API for XML) DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。 我用到的是SAX解析>> 一、XML檔案 <?xml
Java:簡單的解析XML檔案之使用DOM解析
XML簡介 要理解XML,HTML等格式,先來理解文件物件模型DOM 根據 DOM,HTML 文件中的每個成分都是一個節點,這些節點組成了一棵樹。DOM 是這樣規定的:整個文件是一個文件節點每個 HTML 標籤是一個元素節點包含在 HTML 元素中的文字是文字節點每一個 HTML 屬性是一個屬性節