日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证

發(fā)布時間:2023/12/10 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

一、java實現(xiàn)對XML格式的驗證

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

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

看下面student.xml:

張三姓名>

男性別>

20年齡>

學(xué)生>

李四姓名>

女性別>

19年齡>

學(xué)生>

學(xué)生名冊>

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

那么java DOM解析XML如何實現(xiàn)驗證?

下面使用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());

//自定義解析方式,如果不設(shè)置,則使用默認(rèn)實現(xiàn)

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("學(xué)生");

for(int i=0;i

Node node = nodeList.item(i);

NamedNodeMap map = node.getAttributes();

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

//子節(jié)點(diǎn)

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("發(fā)生了錯誤!"+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;

}

}

如果不設(shè)置setEntityResolver,則會使用XML中指定位置的DTD文件進(jìn)行驗證,

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

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

在spring中,為網(wǎng)絡(luò)地址:

/p>

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

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

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

如果設(shè)置了setEntityResolver,則會按照EntityResolver進(jìn)行XML驗證:先去項目中尋找spring-beans.xsd,如果未獲取到則按照網(wǎng)絡(luò)地址尋找。

以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;

}

}

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的java验证xml格式是否正确的是_spring源码附录(1)java实现对XML格式的验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。