java xsd xml文件_如何使用Java和带有include的XSD验证XML文件?

小编典典

您需要使用LSResourceResolver才能正常工作。请查看下面的示例代码。

验证方法:

// note that if your XML already declares the XSD to which it has to conform, then there's no need to declare the schemaName here

void validate(String xml, String schemaName) throws Exception {

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

builderFactory.setNamespaceAware(true);

DocumentBuilder parser = builderFactory

.newDocumentBuilder();

// parse the XML into a document object

Document document = parser.parse(new StringInputStream(xml));

SchemaFactory factory = SchemaFactory

.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

// associate the schema factory with the resource resolver, which is responsible for resolving the imported XSD's

factory.setResourceResolver(new ResourceResolver());

// note that if your XML already declares the XSD to which it has to conform, then there's no need to create a validator from a Schema object

Source schemaFile = new StreamSource(getClass().getClassLoader()

.getResourceAsStream(schemaName));

Schema schema = factory.newSchema(schemaFile);

Validator validator = schema.newValidator();

validator.validate(new DOMSource(document));

}

资源解析器实现:

public class ResourceResolver implements LSResourceResolver {

public LSInput resolveResource(String type, String namespaceURI,

String publicId, String systemId, String baseURI) {

// note: in this sample, the XSD's are expected to be in the root of the classpath

InputStream resourceAsStream = this.getClass().getClassLoader()

.getResourceAsStream(systemId);

return new Input(publicId, systemId, resourceAsStream);

}

}

资源解析器返回的Input实现:

public class Input implements LSInput {

private String publicId;

private String systemId;

public String getPublicId() {

return publicId;

}

public void setPublicId(String publicId) {

this.publicId = publicId;

}

public String getBaseURI() {

return null;

}

public InputStream getByteStream() {

return null;

}

public boolean getCertifiedText() {

return false;

}

public Reader getCharacterStream() {

return null;

}

public String getEncoding() {

return null;

}

public String getStringData() {

synchronized (inputStream) {

try {

byte[] input = new byte[inputStream.available()];

inputStream.read(input);

String contents = new String(input);

return contents;

} catch (IOException e) {

e.printStackTrace();

System.out.println("Exception " + e);

return null;

}

}

}

public void setBaseURI(String baseURI) {

}

public void setByteStream(InputStream byteStream) {

}

public void setCertifiedText(boolean certifiedText) {

}

public void setCharacterStream(Reader characterStream) {

}

public void setEncoding(String encoding) {

}

public void setStringData(String stringData) {

}

public String getSystemId() {

return systemId;

}

public void setSystemId(String systemId) {

this.systemId = systemId;

}

public BufferedInputStream getInputStream() {

return inputStream;

}

public void setInputStream(BufferedInputStream inputStream) {

this.inputStream = inputStream;

}

private BufferedInputStream inputStream;

public Input(String publicId, String sysId, InputStream input) {

this.publicId = publicId;

this.systemId = sysId;

this.inputStream = new BufferedInputStream(input);

}

}

2020-12-01

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值