gpt4 book ai didi

java - 解析模式和同一模式中的导入

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:53 34 4
gpt4 key购买 nike

只是想知道是否有任何方法可以同时解析一个 xsd 文件和一个在原始 xsd 中导入的 xsd,这样我就可以直接访问导入的 xsd 中的元素。是否有任何框架可以实现这一目标?

只是我的意思的一个例子

来 self 要解析的 XSD:

<xsd:import namespace="..." schemaLocation="anotherFile.xsd">

<xsd:element ref="anElement" />

从解析文件中导入的 XSD

<xsd:element name="anElement">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="THIS" />
<xsd:enumeration value="IS" />
<xsd:enumeration value="THE" />
<xsd:enumeration value="ELEMENTS" />
<xsd:enumeration value="I" />
<xsd:enumeration value="WANT" />
<xsd:enumeration value=":-)" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>

所以,我想要的是在我通过某种内联或其他方式解析原始 xsd 时访问导入的 xsd 中的元素:-)

这在某种程度上是可能的吗?

最佳答案

是的,你只需要实现一个 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;
}

}
}

关于java - 解析模式和同一模式中的导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866930/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com