Java 在同一架构中解析架构和导入
只是想知道是否有任何方法可以同时解析xsd文件和在原始xsd中导入的xsd,这样我就可以直接访问导入的xsd中的元素。是否有任何框架使这成为可能 只是我意思的一个例子 从我要分析的XSD:Java 在同一架构中解析架构和导入,java,xml,parsing,dom,xml-parsing,Java,Xml,Parsing,Dom,Xml Parsing,只是想知道是否有任何方法可以同时解析xsd文件和在原始xsd中导入的xsd,这样我就可以直接访问导入的xsd中的元素。是否有任何框架使这成为可能 只是我意思的一个例子 从我要分析的XSD: 从解析文件中导入的XSD 因此,当我通过某种内联或其他方式解析原始xsd时,我想要访问导入的xsd中的元素:-) 这在某种程度上是可能的吗?看起来您需要JAXB将您的模式(包括导入的模式)获取到Java类中。是的,您只需要实现一个LSResourceResolver类,该类将能够
从解析文件中导入的XSD
因此,当我通过某种内联或其他方式解析原始xsd时,我想要访问导入的xsd中的元素:-)
这在某种程度上是可能的吗?看起来您需要JAXB将您的模式(包括导入的模式)获取到Java类中。是的,您只需要实现一个LSResourceResolver类,该类将能够读取您指定的模式位置:
/**
* This function validates a DomResult. T
*
* @param domResult
* @param schemaFile path to the schmea file to validate against.
* @throws org.xml.sax.SAXException
* @throws java.io.IOException
*
*/
protected void validateDomResult(DOMResult domResult, String schemaFile) throws SAXException, IOException, Exception {
Schema schema = createSchema(schemaFile);
javax.xml.validation.Validator validator = schema.newValidator();
ErrorHandler mySchemaErrorHandler = new LoggingErrorHandler();
validator.setErrorHandler(mySchemaErrorHandler);
DOMSource domSource = new DOMSource(domResult.getNode());
validator.validate(domSource);
if (((LoggingErrorHandler) mySchemaErrorHandler).isError()) {
throw new Exception("Validation Error");
}
}
/**
*
* @param baseSchemaFilePath
* @return
* @throws java.lang.Exception
*
*/
protected Schema createSchema(String baseSchemaFilePath) throws Exception {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
LSResourceResolver resourceResolver = (LSResourceResolver) new LocalSchemaLSResourceResolver();
factory.setResourceResolver(resourceResolver);
Schema schema = factory.newSchema(new File(baseSchemaFilePath));
return schema;
}
下面是一个简单的LSResourceResolver实现,它在类路径的xsd目录中查找架构:
public class LocalSchemaLSResourceResolver implements LSResourceResolver{
protected final Log logger = LogFactory.getLog(getClass());
public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {
LSInput input = new DOMInputImpl();
try {
FileInputStream fis = new FileInputStream(new File("classpath:xsd/" + systemId));
input.setByteStream(fis);
return input;
} catch (FileNotFoundException ex) {
logger.error("File Not found", ex);
return null;
}
}
}
当XSD文件位于local/src/main/resources目录或打包在jar中时,这对我来说是有效的:
final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final URL url = this.getClass().getClassLoader().getResource("META-INF/parent.xsd");
final Schema schema = sf.newSchema(url);
parent.xsd包含了“kid.xsd”--两个xsd文件都在同一个目录下谢谢您的回答。我通过使用xson解决了这个问题,Xml模式对象模型。它非常支持fr schema.JAXB可能会工作,但它不适合此任务,因为解析必须动态完成。