Xerces - 从字符串加载模式
Xerces - Load schema from string
我想使用 Xerces 从字符串加载 XML 模式,但直到现在,我只能从 URI 加载它:
final XMLSchemaLoader xsLoader = new XMLSchemaLoader();
final XSModel xsModel = xsLoader.loadURI(file.toURI().toString());
可用的加载方法:
XSLoader {
public XSModel load(LSInput is) { }
public XSModel loadInputList(LSInputList is) { }
public XSModel loadURI(String uri) { }
public XSModel loadURIList(StringList uriList) { }
}
是否有任何选项可以从字符串中加载 XML 架构?在我的上下文中,处理是在客户端完成的,因此无法使用 URI 方法。
谢谢。
我不是特别熟悉你的问题,但我从 ProgramCreek 中找到了这个有用的代码片段,它演示了如何从 LSInput
对象中获取 XSModel
(第一种方法你上面列出的)。也可以从输入流加载 XML 模式。我稍微修改了代码以达到此目的:
private LSInput getLSInput(InputStream is) throws InstantiationException,
IllegalAccessException, ClassNotFoundException {
final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
final DOMImplementationLS impl = (DOMImplementationLS)registry.getDOMImplementation("LS");
LSInput domInput = impl.createLSInput();
domInput.setByteStream(is);
return domInput;
}
用法:
// obtain your file through some means
File file;
LSInput ls = null;
try {
InputStream is = new FileInputStream(file);
// obtain an LSInput object
LSInput ls = getLSInput(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (ls != null) {
XMLSchemaLoader xsLoader = new XMLSchemaLoader();
XSModel xsModel = xsLoader.load(ls);
// now use your XSModel object here ...
}
基于@TimBiegeleisen 的回答,我构建了一个将字符串转换为 XSModel 的方法。
private static XSModel getSchema(String schemaText) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, ClassCastException {
final InputStream stream = new ByteArrayInputStream(schemaText.getBytes(StandardCharsets.UTF_8));
final LSInput input = new DOMInputImpl();
input.setByteStream(stream);
final XMLSchemaLoader xsLoader = new XMLSchemaLoader();
return xsLoader.load(input);
}
我想使用 Xerces 从字符串加载 XML 模式,但直到现在,我只能从 URI 加载它:
final XMLSchemaLoader xsLoader = new XMLSchemaLoader();
final XSModel xsModel = xsLoader.loadURI(file.toURI().toString());
可用的加载方法:
XSLoader {
public XSModel load(LSInput is) { }
public XSModel loadInputList(LSInputList is) { }
public XSModel loadURI(String uri) { }
public XSModel loadURIList(StringList uriList) { }
}
是否有任何选项可以从字符串中加载 XML 架构?在我的上下文中,处理是在客户端完成的,因此无法使用 URI 方法。
谢谢。
我不是特别熟悉你的问题,但我从 ProgramCreek 中找到了这个有用的代码片段,它演示了如何从 LSInput
对象中获取 XSModel
(第一种方法你上面列出的)。也可以从输入流加载 XML 模式。我稍微修改了代码以达到此目的:
private LSInput getLSInput(InputStream is) throws InstantiationException,
IllegalAccessException, ClassNotFoundException {
final DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
final DOMImplementationLS impl = (DOMImplementationLS)registry.getDOMImplementation("LS");
LSInput domInput = impl.createLSInput();
domInput.setByteStream(is);
return domInput;
}
用法:
// obtain your file through some means
File file;
LSInput ls = null;
try {
InputStream is = new FileInputStream(file);
// obtain an LSInput object
LSInput ls = getLSInput(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (ls != null) {
XMLSchemaLoader xsLoader = new XMLSchemaLoader();
XSModel xsModel = xsLoader.load(ls);
// now use your XSModel object here ...
}
基于@TimBiegeleisen 的回答,我构建了一个将字符串转换为 XSModel 的方法。
private static XSModel getSchema(String schemaText) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, ClassCastException {
final InputStream stream = new ByteArrayInputStream(schemaText.getBytes(StandardCharsets.UTF_8));
final LSInput input = new DOMInputImpl();
input.setByteStream(stream);
final XMLSchemaLoader xsLoader = new XMLSchemaLoader();
return xsLoader.load(input);
}