Java include of_如何使用Java和带有include的XSD验证XML文件?

我必须对AMegmondoEmber的帖子进行一些修改

我的主架构文件包含同级文件夹中的一些包含,并且包含的文件还包含其本地文件夹中的一些包含。我还必须跟踪基本资源路径和当前资源的相对路径。该代码对我来说有效,但是请记住,它假定所有xsd文件都具有唯一的名称。如果您有一些xsd文件具有相同的名称,但内容位于不同的路径,则可能会给您带来问题。

import java.io.ByteArrayInputStream;

import java.io.InputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.w3c.dom.ls.LSInput;

import org.w3c.dom.ls.LSResourceResolver;

/**

* The Class ResourceResolver.

*/

public class ResourceResolver implements LSResourceResolver {

/** The logger. */

private final Logger logger = LoggerFactory.getLogger(this.getClass());

/** The schema base path. */

private final String schemaBasePath;

/** The path map. */

private Map pathMap = new HashMap();

/**

* Instantiates a new resource resolver.

*

* @param schemaBasePath the schema base path

*/

public ResourceResolver(String schemaBasePath) {

this.schemaBasePath = schemaBasePath;

logger.warn("This LSResourceResolver implementation assumes that all XSD files have a unique name. "

+ "If you have some XSD files with same name but different content (at different paths) in your schema structure, "

+ "this resolver will fail to include the other XSD files except the first one found.");

}

/* (non-Javadoc)

* @see org.w3c.dom.ls.LSResourceResolver#resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)

*/

@Override

public LSInput resolveResource(String type, String namespaceURI,

String publicId, String systemId, String baseURI) {

// The base resource that includes this current resource

String baseResourceName = null;

String baseResourcePath = null;

// Extract the current resource name

String currentResourceName = systemId.substring(systemId

.lastIndexOf("/") + 1);

// If this resource hasn't been added yet

if (!pathMap.containsKey(currentResourceName)) {

if (baseURI != null) {

baseResourceName = baseURI

.substring(baseURI.lastIndexOf("/") + 1);

}

// we dont need "./" since getResourceAsStream cannot understand it

if (systemId.startsWith("./")) {

systemId = systemId.substring(2, systemId.length());

}

// If the baseResourcePath has already been discovered, get that

// from pathMap

if (pathMap.containsKey(baseResourceName)) {

baseResourcePath = pathMap.get(baseResourceName);

} else {

// The baseResourcePath should be the schemaBasePath

baseResourcePath = schemaBasePath;

}

// Read the resource as input stream

String normalizedPath = getNormalizedPath(baseResourcePath, systemId);

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

.getResourceAsStream(normalizedPath);

// if the current resource is not in the same path with base

// resource, add current resource's path to pathMap

if (systemId.contains("/")) {

pathMap.put(currentResourceName, normalizedPath.substring(0,normalizedPath.lastIndexOf("/")+1));

} else {

// The current resource should be at the same path as the base

// resource

pathMap.put(systemId, baseResourcePath);

}

Scanner s = new Scanner(resourceAsStream).useDelimiter("\\A");

String s1 = s.next().replaceAll("\\n", " ") // the parser cannot understand elements broken down multiple lines e.g. ()

.replace("\\t", " ") // these two about whitespaces is only for decoration

.replaceAll("\\s+", " ").replaceAll("[^\\x20-\\x7e]", ""); // some files has a special character as a first character indicating utf-8 file

InputStream is = new ByteArrayInputStream(s1.getBytes());

return new LSInputImpl(publicId, systemId, is); // same as Input class

}

// If this resource has already been added, do not add the same resource again. It throws

// "org.xml.sax.SAXParseException: sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ..."

// return null instead.

return null;

}

/**

* Gets the normalized path.

*

* @param basePath the base path

* @param relativePath the relative path

* @return the normalized path

*/

private String getNormalizedPath(String basePath, String relativePath){

if(!relativePath.startsWith("../")){

return basePath + relativePath;

}

else{

while(relativePath.startsWith("../")){

basePath = basePath.substring(0,basePath.substring(0, basePath.length()-1).lastIndexOf("/")+1);

relativePath = relativePath.substring(3);

}

return basePath+relativePath;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值