解析XML時DTD的處理--解析時忽略,生成XML檔案時加上
一、解析XML檔案時,遇到DTD的定義要怎麼辦?
下面這段程式碼是ibatis配置檔案,用w3c Dom(其實任意一種解析方式都是這樣)都會從http://www.ibatis.com/dtd/sql-map-config-2.dtd 這 個地址找對應的DTD檔案進行校驗,如果因特網上這個地址不存在的話,就會報 java.net.ConnectException: Connection timed out: connect 。
Xml程式碼- <?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
- <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
- < sqlMapConfig >
- < settings useStatementNamespaces = "true" />
- <!--防止空SqlMap報錯 by zhangbo start -->
- <
sqlMap
resource
=
"ibatis/project/project-blank.xml"
- < sqlMap resource = "ibatis/project/user-mapping.xml" />
- </ sqlMapConfig >
遇到這種問題可以有兩種解析方式,第一把DTD下載的本地,指定從本地載入DTD檔案;另一種,乾脆忽略DTD檔案。
這兩種方式都是以重新構建實體的解析器(EntityResolver)為基礎解決方案的,重新構建實體解析器而不是使用預設的實體解析器,因為默 認的解析器會根據實際的url進行讀取,下面是一段如何來解析上面提到的配置檔案,兩種方式都有標註
Java程式碼- public void addToIbatisTotleConfig() {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory
- .newInstance();
- factory.setIgnoringElementContentWhitespace(true );
- DocumentBuilder db = factory.newDocumentBuilder();
- db.setEntityResolver(new EntityResolver(){
- public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
- if (publicId.equals( "-//iBATIS.com//DTD SQL Map Config 2.0//EN" )){
- //這是第一種方式,即忽略DTD,新建一個預設的空XML來代替
- return new InputSource( new ByteArrayInputStream( "<?xml version='1.0' encoding='GBK'?>" .getBytes()));
- //這是第二種方式,即指定本地的DTD檔案,當然,這種方式需要把XML檔案下載到本地,放入對應的目錄中
- // InputStream dtd_stream = this.getClass().getResourceAsStream("..//dtd/sql-map-config-2.dtd");
- // return new InputSource(dtd_stream);
- }
- return null ;
- }});
- String ibatisTotalConfigFileName = ctx.getIbatisTotalConfigFile();
- File ibatisTotalConfigFile = new File(ibatisTotalConfigFileName);
- Document xmldoc = db.parse("file://localhost//" +ibatisTotalConfigFileName);
- Element root = xmldoc.getDocumentElement();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
public void addToIbatisTotleConfig() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder db = factory.newDocumentBuilder();
db.setEntityResolver(new EntityResolver(){
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
if(publicId.equals("-//iBATIS.com//DTD SQL Map Config 2.0//EN")){
//這是第一種方式,即忽略DTD,新建一個預設的空XML來代替
return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='GBK'?>".getBytes()));
//這是第二種方式,即指定本地的DTD檔案,當然,這種方式需要把XML檔案下載到本地,放入對應的目錄中
// InputStream dtd_stream = this.getClass().getResourceAsStream("..//dtd/sql-map-config-2.dtd");
// return new InputSource(dtd_stream);
}
return null;
}});
String ibatisTotalConfigFileName = ctx.getIbatisTotalConfigFile();
File ibatisTotalConfigFile = new File(ibatisTotalConfigFileName);
Document xmldoc = db.parse("file://localhost//"+ibatisTotalConfigFileName);
Element root = xmldoc.getDocumentElement();
} catch (Exception e) {
e.printStackTrace();
}
}
二、使用W3CDom編輯完上面的XML檔案,把document轉換為XML檔案的時候,DTD定義會丟失,如果要加上,要怎麼辦?
加DTD定義時,要在轉換器中操作,重點使用這個兩句程式碼:
Java程式碼- transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());
- transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
DTD定義的值在document物件中是有的,你可以直接輸出,也可以改變。
下面是我的實際應用
Java程式碼- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerConfigurationException;
- import javax.xml.transform.TransformerException;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.stream.StreamResult;
- import javax.xml.xpath.XPath;
- import javax.xml.xpath.XPathConstants;
- import javax.xml.xpath.XPathExpressionException;
- import javax.xml.xpath.XPathFactory;
- import org.w3c.dom.Document;
- import org.w3c.dom.Node;
- public static void saveXml(String fileName, Document doc) { // 將Document輸出到檔案
- TransformerFactory transFactory = TransformerFactory.newInstance();
- try {
- Transformer transformer = transFactory.newTransformer();
- transformer.setOutputProperty("indent" , "yes" );
- DOMSource source = new DOMSource();
- source.setNode(doc);
- System.out.println(doc.getDoctype().getPublicId());
- transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());
- transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
- StreamResult result = new StreamResult();
- result.setOutputStream(new FileOutputStream(fileName));
- transformer.transform(source, result);
- } catch (TransformerConfigurationException e) {
- e.printStackTrace();
- } catch (TransformerException e) {
- e.printStackTrace();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
public static void saveXml(String fileName, Document doc) {// 將Document輸出到檔案
TransformerFactory transFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty("indent", "yes");
DOMSource source = new DOMSource();
source.setNode(doc);
System.out.println(doc.getDoctype().getPublicId());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
StreamResult result = new StreamResult();
result.setOutputStream(new FileOutputStream(fileName));
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
相關推薦
解析XML時DTD的處理--解析時忽略,生成XML檔案時加上
一、解析XML檔案時,遇到DTD的定義要怎麼辦? 下面這段程式碼是ibatis配置檔案,用w3c Dom(其實任意一種解析方式都是這樣)都會從http://www.ibatis.com/dtd/sql-map-config-2.dtd 這 個地址找對應的DTD檔案進行校驗,如果因特網上這個地址
淺談android6.0的新特性之執行時許可權處理解析
一.相關介紹 新的許可權機制更好的保護了使用者的隱私,Google將許可權分為兩類,一類是Normal Permissions,這類許可權一般不涉及使用者隱私,是不需要使用者進行授權的,比如手機震動、訪問網路等;另一類是Dangerous Permission
mybatis generator生成對映檔案時,執行多次,導致xml檔案生成錯誤,設定table schema也無效
在maven中集成了MBG以後,生成xml等對映檔案時,會生成多次。由於xml檔案是追加,導致xml檔案有多次生成的結果。 原因: 1):在資料庫伺服器上,不同的資料庫中表名相同的表多張。(有幾個同名的表,就會生成幾次) 2):mysql驅動升級到8.x,造成設定sch
Java中讀取XML檔案,生成XML格式的字串並解析這個字串
由於最近要用的是XML格式的字串,而不用寫到檔案中,所以對原始程式碼進行了修改如下: 要讀的xml檔案 <?xml version="1.0" encoding="GB2312"?> <學生花名冊> <學生 性別 = "男">
ffmpeg處理斷網時,生成一個檔案中遇到的問題
由於網路環境不穩定,在實際的錄影過程中常常會將錄製的檔案儲存為多個視訊檔案,後期就需要更多的資源來進行視訊合併,並且增加了額外的時間開銷。為了解決這個問題,同時考慮到時間的開銷以及資源佔用率最小,就想出了這樣的一個辦法,在斷網時,av_read_frame()會在
java利用qrcode.jar進行處理二維碼,生成、解析二維碼
首先,這裡貼出jar。 生成二維碼: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
sublime3 一直用的好好,sftp同步檔案時忽然提示encoding error,Validating remote folder “/var” failure (Encoding error)
sublime3 一直用的好好,sftp同步檔案時忽然提示encoding error,Validating remote folder “/var/XX”... failure (Encoding error) ,報錯資訊是:An encoding error was encountered tr
正確生成浮點型的方法,解決sqlachemy Float浮點型的坑,生成float型別時,長度和精度均為0,導致查詢不到結果!
問題描述 在使用flask_sqlachemy時,給price欄位選擇了Float型別,資料庫用的mysql,生成資料庫表後,發現 from sqlalchemy import Float,Column price = Column(Float,default=0.00) &
Linux 下使用eclipse,開啟jsp檔案時閃退
報錯:eclipse: cairo-misc.c:380: _cairo_operator_bounded_by_source: Assertion `NOT_REACHED' failed. &n
python anaconda安裝sklearn時出現:DLL load failed,或者匯入numpy時出現匯入模組錯誤問題
python anaconda安裝sklearn時出現:DLL load failed,或者匯入numpy時出現匯入模組錯誤問題 出現原因 出現原因 一、如果遇到錯誤:ImportError:DLLloadfailed 1、找不到指定的模組,出現錯
已經解決django生成po檔案時出現的xgettext的錯誤
通過摸索和查閱django官網文件,我今天已經解決windows上執行django-admin.py makemessages -l zh_CN 後出現'xgettext'不是內部或外部命令,也不是可執行的程式或批處理檔案的錯誤 原因和解決辦法是: 分析django的原始
Xcode 編譯C++程式,freopen 讀取檔案時檔案路徑問題
在除錯程式時,有時候會有許多的輸入,如果每次Debug都自己輸入測試樣例的話會非常麻煩。 所以將輸入重定向到指定檔案,從檔案讀取輸入就方便多了。 在C++中,可以呼叫freopen這個函式來實現此功能,此函式包含在標頭檔案<iostream>中,也方便呼叫。 f
根據給定的文字檔案words.txt(可將該檔案存放在任意目錄,注意開啟檔案時要加入正確的路徑)
一、根據給定的文字檔案words.txt(可將該檔案存放在任意目錄,注意開啟檔案時要加入正確的路徑)編寫函式loadWords(),words.txt包含若干小寫英文單詞。要求:1)讀入該檔案,統計並輸
PHP 生成 csv 檔案時亂碼解決
今天處理PHP匯出資料時遇到了亂碼問題,下載的程式檔案為utf-8編碼,下載下來的csv檔案用編輯器開啟也是utf-8編碼,但直接用excel開啟時確顯示亂碼。後來從網上找到一篇文章得以解決,在此儲存。原文章地址為:http://www.haoguoliang.com/
Python 中使用 ogr 生成 shape 檔案時的中文亂碼問題
GDAL/OGR 的 1.9 版本開始,ogr 對中文的支援有了較大的改動。預設情況下,使用 Python 的 osgeo.ogr 生成 shape 檔案時,直接使用 SetField 來設定屬性值,其中如果含有中文就會出現亂碼。在 driver 初始化之前,設定 gdal
mybatis-generator自動建立資料庫中的表,生成的檔案有實體類,mapper.xml配置檔案等
這兩天需要用到MyBatis的程式碼自動生成的功能,由於MyBatis屬於一種半自動的ORM框架,所以主要的工作就是配置Mapping對映檔案,但是由於手寫對映檔案很容易出錯,所以可利用MyBatis生成器自動生成實體類、DAO介面和Mapping對映檔案。這樣可以省去很多的
解析XML檔案時,無效的XML 字元 (Unicode: 0x7)異常處理
報錯資訊: 2015-01-29 00:10:22,075 ERROR commonapi.CommonApiAction - errorCode:5000,5000-00;Description:程式異常。Error on line 1 of document :
用JDOM解析XML檔案時如何解決中文問題?如何解析?
1 import javax.xml.parsers.DocumentBuilder; 2 import javax.xml.parsers.DocumentBuilderFactory; 3 import javax.xml.transform.OutputKeys; 4 import jav
Android 6 0 執行時許可權處理完全解析
一、概述ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。當然非常推薦閱讀官網許可權相關文章:本文也是在上述文章基礎上理解、實驗以及封裝。二、執行時許可權的變化及特點對於6.0以下的許可權及在安裝的時候,根據許可權宣告產生一個
Android 6.0 執行時許可權處理完全解析
一、概述 ok,本篇文章目的之一就是對執行時許可權處理的一個介紹,以及對目前許可權相關的庫的一些瞭解。 當然非常推薦閱讀官網許可權相關文章: 本文也是在上述文章基礎上理解、實驗以及封裝。 二、執行時許可權的變化及特點 對於6.0以下