1. 程式人生 > >java解析xml檔案讀取本地dtd或者忽略dtd

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 SAXExceptionIOException

方法指定讀取本地的dtd檔案,該放在在XML解析器解析xml之前呼叫,用於載入指定的dtd檔案:

/**
 * 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。 在使

JavaXML檔案讀取到資料庫

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 屬性是一個屬性節