java xsd校验字符串xml,针对Java中的XSD验证XML /获取schemaLocation

小编典典

假设您使用的是Xerces(或JDK的默认设置),是否尝试过在工厂将该功能设置为true:http

:

//apache.org/xml/features/validation/schema。关于架构,您还可以使用其他功能:http

:

//xerces.apache.org/xerces2-j/features.html

更新2(用于缓存):

实施org.w3c.dom.ls.LSResourceResolver并SchemaFactory使用

setResourceResolver方法设置该值。该解析器将从缓存中获取架构,或者从位置引用的任何地方获取架构。

更新3:

LSResourceresolver示例(我认为这对您来说是一个很好的起点):

/**

* Resolves resources from a base URL

*/

public class URLBasedResourceResolver implements LSResourceResolver {

private static final Logger log = LoggerFactory

.getLogger(URLBasedResourceResolver.class);

private final URI base;

private final Map nsmap;

public URLBasedResourceResolver(URL base, Map nsmap)

throws URISyntaxException {

super();

this.base = base.toURI();

this.nsmap = nsmap;

}

@Override

public LSInput resolveResource(String type, String namespaceURI,

String publicId, String systemId, String baseURI) {

if (log.isDebugEnabled()) {

String msg = String

.format("Resolve: type=%s, ns=%s, publicId=%s, systemId=%s, baseUri=%s.",

type, namespaceURI, publicId, systemId, baseURI);

log.debug(msg);

}

if (type.equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) {

if (namespaceURI != null) {

try {

URI ns = new URI(namespaceURI);

if (nsmap.containsKey(ns))

return new MyLSInput(base.resolve(nsmap.get(ns)));

} catch (URISyntaxException e) {

// ok

}

}

}

return null;

}

}

MyLSInput的实现真的很无聊:

class MyLSInput implements LSInput {

private final URI url;

public MyLSInput(URI url) {

super();

this.url = url;

}

@Override

public Reader getCharacterStream() {

return null;

}

@Override

public void setCharacterStream(Reader characterStream) {

}

@Override

public InputStream getByteStream() {

return null;

}

@Override

public void setByteStream(InputStream byteStream) {

}

@Override

public String getStringData() {

return null;

}

@Override

public void setStringData(String stringData) {

}

@Override

public String getSystemId() {

return url.toASCIIString();

}

@Override

public void setSystemId(String systemId) {

}

@Override

public String getPublicId() {

return null;

}

@Override

public void setPublicId(String publicId) {

}

@Override

public String getBaseURI() {

return null;

}

@Override

public void setBaseURI(String baseURI) {

}

@Override

public String getEncoding() {

return null;

}

@Override

public void setEncoding(String encoding) {

}

@Override

public boolean getCertifiedText() {

return false;

}

@Override

public void setCertifiedText(boolean certifiedText) {

}

}

2020-11-01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值