java驗證xml格式是否正確的是_spring源碼附錄(1)java實現對XML格式的驗證

最近在看spring源碼,涉及到xml文檔的解析、xml文檔的格式驗證,發現自己對xml解析的基礎較為薄弱,本篇博客復習下DOM方式解析xml(即spring解析xml的方式)。

DOM解析XML是將整個XML作為一個對象,占用內存較多。另外一個java官方的XML解析方式SAX是邊掃描邊解析,自頂向下依次解析,占用內存較少。

一、java實現對XML格式的驗證

可以使用兩種驗證模式(DTD、XSD)保證XML文件格式正確,DTD和XSD均是XML約束描述語言,是XML文件的驗證機制。本文以DTD為例。

DTD文件格式請參考:http://www..com/zhengcheng/p/4278899.html

看下面student.xml:

張三姓名>

男性別>

20年齡>

學生>

李四姓名>

女性別>

19年齡>

學生>

學生名冊>

我們看到上面這個XML指定的DTD驗證文件為student.dtd:

那么java DOM解析XML如何實現驗證?

下面使用DOM解析student.xml:

public class test {

public static void main(String[] args) {

DocumentBuilderFactory buildFactory = DocumentBuilderFactory.newInstance();

//開啟XML格式驗證

buildFactory.setValidating(true);

try {

DocumentBuilder build = buildFactory.newDocumentBuilder();

//指定驗證出錯處理類MyErrorHandle

build.setErrorHandler(new MyErrorHandler());

//自定義解析方式,如果不設置,則使用默認實現

build.setEntityResolver(new MyResolveEntity());

Document doc = build.parse("student.xml");

getStudents(doc);

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

private static void getStudents(Document doc) {

Element root = doc.getDocumentElement();

NodeList nodeList = root.getElementsByTagName("學生");

for(int i=0;i

Node node = nodeList.item(i);

NamedNodeMap map = node.getAttributes();

System.out.println(map.item(0).getTextContent());

//子節點

NodeList childList = node.getChildNodes();

for(int j=0;j

Node childNode = childList.item(j);

System.out.println(childNode.getTextContent());

}

}

}

}

public class MyErrorHandler implements ErrorHandler{

@Override

public void warning(SAXParseException exception) throws SAXException {

// TODO Auto-generated method stub

}

@Override

public void error(SAXParseException exception) throws SAXException {

System.out.println("發生了錯誤!"+exception.getMessage());

}

@Override

public void fatalError(SAXParseException exception) throws SAXException {

// TODO Auto-generated method stub

}

}

public class MyResolveEntity implements EntityResolver{

@Override

public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {

return new InputSource("student.dtd");

//return null;

}

}

如果不設置setEntityResolver,則會使用XML中指定位置的DTD文件進行驗證,

student.dtd即指定了驗證文件的位置。

二、spring源碼中對XML文件的驗證的處理

在spring中,為網絡地址:

/p>

"http://www.springframework.org/dtd/spring-beans.dtd">

publicId:-//SPRING//DTD BEAN//EN

systemId:http://www.springframework.org/dtd/spring-beans.dtd

如果設置了setEntityResolver,則會按照EntityResolver進行XML驗證:先去項目中尋找spring-beans.xsd,如果未獲取到則按照網絡地址尋找。

以spring中 Spring-beans.dtd為例:

public class BeansDtdResolver implements EntityResolver {

private static final String DTD_EXTENSION = ".dtd";

private static final String DTD_NAME = "spring-beans";

private static final Log logger = LogFactory.getLog(BeansDtdResolver.class);

@Override

public InputSource resolveEntity(String publicId, String systemId) throws IOException {

if (logger.isTraceEnabled()) {

logger.trace("Trying to resolve XML entity with public ID [" + publicId +

"] and system ID [" + systemId + "]");

}

if (systemId != null && systemId.endsWith(DTD_EXTENSION)) {

int lastPathSeparator = systemId.lastIndexOf("/");

int dtdNameStart = systemId.indexOf(DTD_NAME, lastPathSeparator);

if (dtdNameStart != -1) {

String dtdFile = DTD_NAME + DTD_EXTENSION;

if (logger.isTraceEnabled()) {

logger.trace("Trying to locate [" + dtdFile + "] in Spring jar on classpath");

}

try {

Resource resource = new ClassPathResource(dtdFile, getClass());

InputSource source = new InputSource(resource.getInputStream());

source.setPublicId(publicId);

source.setSystemId(systemId);

if (logger.isDebugEnabled()) {

logger.debug("Found beans DTD [" + systemId + "] in classpath: " + dtdFile);

}

return source;

}

catch (IOException ex) {

if (logger.isDebugEnabled()) {

logger.debug("Could not resolve beans DTD [" + systemId + "]: not found in classpath", ex);

}

}

}

}

// Use the default behavior -> download from website or wherever.

return null;

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 批量打印_JAVA批量打印皕杰報表

原標題:JAVA批量打印皕杰報表不使用皕杰報表工具條上的打印按鈕,用java怎么實現批量打印皕杰報表呢?解決方案:皕杰報表提供了批量打印的工具類ReportToolkits,ReportToolkits類參考幫助文檔-開發指南-javadoc-bios.rep…

java 截串_java字符串截取

import org.apache.commons.lang.stringutils;public class substr{public static void main(string[] args) {string str "1234567890abcdefg";system.out.println("-----------" str.substring(0)); //從字符串索引為0開始截取,一直到字符串…

java json 構造_json 構造和解析

目錄:(1)引入jar包;(2)json的構造;(3)json的解析;(4)遍歷未知key。(1)java對json的處理,可借助org.json.jar.org.jsonjson20090211(2)json的構造//construct json and output itpublic String constructJson() throws …

java http 上傳文件_java利用httpClient實現后臺文件上傳請求

之前寫過基于html和js的文件上傳方法java 用springMVC 和HttpServletRequest 兩種實現文件上傳的方法和httpClient后臺執行普通post請求的文章java通過httpClient從接口請求數據入庫以及自動生成實體工具類,最近接到一個需求,需要用到后臺去調用遠程服務…

morse java_華威MORSE,華威數統那個比較好?

其實沒什么高下之分了。 畢竟大家都在一個系,上下課交作業都在一起。我個人覺得,數統要比morse更flexible一些。首先你要明白morse和數統課程上的區別在哪里:數統 大一必修數統大一必修共計84CATSmorse大一必修morse大一必修共計120CATS其實差的就是EC10…

java中 以下接口以鍵_java復習題

1.Java中的long類型占用()個字節。A、1B、2C、4D、82.以下關于繼承的敘述不正確的是()。A、在Java中類只允許單一繼承B、在Java中一個類只能實現一個接口C、在Java中一個類可以同時繼承一個類和實現一個接口D、在Java中接口允許多繼承3.4&…

Java游戲有易筋經_易筋經- JavaWeb-1

JavaScript一種直譯式腳本語言,是一種動態類型、弱類型、基于原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言組成部分:ECMAScript:js基礎語法(規定 關鍵字 運算符 語句 函數…

java導出hbase表數據_通用MapReduce程序復制HBase表數據

編寫MR程序,讓其可以適合大部分的HBase表數據導入到HBase表數據。其中包括可以設置版本數、可以設置輸入表的列導入設置(選取其中某幾列)、可以設置輸出表的列導出設置(選取其中某幾列)。原始表test1數據如下:每個row key都有兩個版本的數據,…

java雙語試卷_Java程序設計基礎(雙語)試題題目及答案,課程2021最新期末考試題庫,章節測驗答案...

若二項式(x+13x)n的展開式中含3x的項是第三項,則n的值是______.(x2+1ax)6(a>0)的展開式中常數項是15,那么展開式中所有項系數和是______.(x2+1ax)6(a>0)的展開式中常數項…

java服務器和linux_在Linux下開一個Java服務器(使用CatServer Pro)

引言Linux開服具有快速,高效,性能等特點,而Windows雖然簡單,但是不具備Linux良好的性能。本教程就說明一下簡單的Linux開服方式(需要教程的人,如果你學會后,請無償幫助更多的人。)服務器準備首先。先準備一…

java中js九個隱含對象_第九章 JSP標簽——《跟我學Shiro》

Shiro提供了JSTL標簽用于在JSP/GSP頁面進行權限控制,如根據登錄用戶顯示相應的頁面按鈕。導入標簽庫標簽庫定義在shiro-web.jar包下的META-INF/shiro.tld中定義。guest標簽歡迎游客訪問,登錄用戶沒有身份驗證時顯示相應信息,即游客訪問信息。…

java中jsp標準動作_JavaBean和jsp標準動作

一.JavaBean 1.理解:可以重用的java類 2.分類 1)封裝數據的bean(相當于實體類) 2)封裝業務的bean(一般就是實現增刪改查) 3.注意: 1)封裝數據的bean一般要滿足如下兩個條件 1.implements Serializable:實現序列化接口 2.擁有一個無參的public…

我的世界java版游戲崩潰_我的世界全攻略之-游戲崩潰的解決方法

我的世界崩潰怎么辦?下面吾愛網小編給大家帶來我的世界無法正常啟動的解決方法,需要的朋友可以參考下。我的世界作為許多玩家都十分喜愛的模擬經營沙盤類游戲,經常有玩家反映在玩我的世界的時候,游戲總是會出現崩潰或者無法啟動的情況,玩家在遇到的時候不知道怎么辦…

手寫實現java中的trim_JS中字符串trim()使用示例

示例一:測試JS擴展方法// 合并多個空白為一個空白String.prototype.ResetBlank function() { //對字符串擴展var regEx /\s/g;return this.replace(regEx, );};window.onload function(){var str "你 在他想還好嗎?";alert(str);str str.ResetBlan…

java excil表格開發_JAVA導出Excel電子表格的方法

JAVA導出Excel電子表格的方法package com.qingruxu.excel;import java.io.File;import java.io.IOException;import java.net.URL;import jxl.Sheet;import jxl.Workbook;import jxl.format.Border;import jxl.read.biff.BiffException;import jxl.write.Blank;import jxl.writ…

vue3 新項目 - 搭建路由router

創建router/index 文件 main.ts 安裝 router 然后 在 app下面 去 設置 路由出口

java json中的注釋_如何使用Java中的@Expose注釋從JSON中排除字段?

Gson Expose批注可用于標記要公開或不公開(串行化或反序列化)的字段。 expose注釋可以取兩個參數和每個參數是可以采取任一值的布爾真或假。為了使GSON對Expose批注做出反應,我們必須使用GsonBuilder類創建一個Gson實例,并需要調用excludeFieldsWithoutE…

java 屏蔽郵箱_使用javamail發送郵件的時候如何阻止附件內容輸出到控制臺

我在使用JavaMail發送帶附件的郵件時候,每次到了Transport.sendMessage()這一步,控制臺就會輸出附件內容,請問如何設置可以取消輸出呢?public void sendFileAttachedMail(String fromMail, String toMail, String fromMailPwd, St…

java如何獲得相反的顏色_javascript – 如何根據當前顏色生成相反的顏色?

更新:GitHub上的生產就緒代碼.我就是這樣做的:>將HEX轉換為RGB>反轉R,G和B組件>將每個組件轉換回HEX>用零和輸出填充每個組件.function invertColor(hex) {if (hex.indexOf(#) 0) {hex hex.slice(1);}// convert 3-digit hex to 6-digits.…

php暫停循環,在特定數量的遞歸循環后,PHP停止執行

我遇到的問題很奇怪。 在執行遞歸循環時會發生這種情況。 使用for循環或任何其他迭代執行相同任務時,不會發生這種情況。在?21 000次以下遞歸調用函數時,一切正常。 超過此數字時會出現問題。我的工作代碼:foo();function foo($i 1) {if ($…