1. 程式人生 > >解析XML時DTD的處理--解析時忽略,生成XML檔案時加上

解析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程式碼
  1. <? xml version = "1.0" encoding = "UTF-8" ?>
  2. <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
  3. < sqlMapConfig >
  4. < settings useStatementNamespaces = "true" />
  5. <!--防止空SqlMap報錯 by zhangbo start -->
  6. < sqlMap resource = "ibatis/project/project-blank.xml"
    />
  7. < sqlMap resource = "ibatis/project/user-mapping.xml" />
  8. </ sqlMapConfig >

   遇到這種問題可以有兩種解析方式,第一把DTD下載的本地,指定從本地載入DTD檔案;另一種,乾脆忽略DTD檔案。

這兩種方式都是以重新構建實體的解析器(EntityResolver)為基礎解決方案的,重新構建實體解析器而不是使用預設的實體解析器,因為默 認的解析器會根據實際的url進行讀取,下面是一段如何來解析上面提到的配置檔案,兩種方式都有標註

Java程式碼
  1. public void  addToIbatisTotleConfig() {  
  2.         try  {  
  3.             DocumentBuilderFactory factory = DocumentBuilderFactory  
  4.                     .newInstance();  
  5.             factory.setIgnoringElementContentWhitespace(true );  
  6.             DocumentBuilder db = factory.newDocumentBuilder();            
  7.             db.setEntityResolver(new  EntityResolver(){  
  8.             public  InputSource resolveEntity(String publicId, String systemId)  throws  SAXException, IOException {                  
  9.                            if (publicId.equals( "-//iBATIS.com//DTD SQL Map Config 2.0//EN" )){  
  10.                               //這是第一種方式,即忽略DTD,新建一個預設的空XML來代替
  11.                                return new  InputSource( new  ByteArrayInputStream( "<?xml version='1.0' encoding='GBK'?>" .getBytes()));  
  12.                                //這是第二種方式,即指定本地的DTD檔案,當然,這種方式需要把XML檔案下載到本地,放入對應的目錄中
  13.                               // InputStream dtd_stream = this.getClass().getResourceAsStream("..//dtd/sql-map-config-2.dtd");
  14.                               //    return new InputSource(dtd_stream);
  15.                            }                            
  16.                     return null ;  
  17.                 }});  
  18.             String ibatisTotalConfigFileName = ctx.getIbatisTotalConfigFile();  
  19.             File ibatisTotalConfigFile = new  File(ibatisTotalConfigFileName);  
  20.             Document xmldoc = db.parse("file://localhost//" +ibatisTotalConfigFileName);  
  21.             Element root = xmldoc.getDocumentElement();  
  22.             } catch  (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
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程式碼
  1. transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());    
  2.           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程式碼
  1. import  java.io.File;  
  2. import  java.io.FileNotFoundException;  
  3. import  java.io.FileOutputStream;  
  4. import  javax.xml.transform.Transformer;  
  5. import  javax.xml.transform.TransformerConfigurationException;  
  6. import  javax.xml.transform.TransformerException;  
  7. import  javax.xml.transform.TransformerFactory;  
  8. import  javax.xml.transform.dom.DOMSource;  
  9. import  javax.xml.transform.stream.StreamResult;  
  10. import  javax.xml.xpath.XPath;  
  11. import  javax.xml.xpath.XPathConstants;  
  12. import  javax.xml.xpath.XPathExpressionException;  
  13. import  javax.xml.xpath.XPathFactory;  
  14. import  org.w3c.dom.Document;  
  15. import  org.w3c.dom.Node;       
  16. public static void  saveXml(String fileName, Document doc) { // 將Document輸出到檔案   
  17.             TransformerFactory transFactory = TransformerFactory.newInstance();     
  18.             try  {     
  19.                 Transformer transformer = transFactory.newTransformer();     
  20.                 transformer.setOutputProperty("indent" "yes" );     
  21.                 DOMSource source = new  DOMSource();     
  22.                 source.setNode(doc);    
  23.                 System.out.println(doc.getDoctype().getPublicId());  
  24.                 transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_PUBLIC, doc.getDoctype().getPublicId());    
  25.                 transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());  
  26.                 StreamResult result = new  StreamResult();     
  27.                 result.setOutputStream(new  FileOutputStream(fileName));     
  28.                 transformer.transform(source, result);     
  29.             } catch  (TransformerConfigurationException e) {     
  30.                 e.printStackTrace();     
  31.             } catch  (TransformerException e) {     
  32.                 e.printStackTrace();     
  33.             } catch  (FileNotFoundException e) {     
  34.                 e.printStackTrace();     
  35.             }     
  36.         }   
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();   
	        }   
	    } 

相關推薦

解析XMLDTD處理--解析忽略生成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 errorValidating 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以下