gpt4 book ai didi

java - JAXP - 调试 XSD 目录查找

转载 作者:行者123 更新时间:2023-12-01 05:38:57 25 4
gpt4 key购买 nike

我遇到一种情况,我们想要根据文件系统中放置的 XSD 来验证作为字节流保存在内存中的 XML 文档。我们希望避免在 XML 文件中明确提及文件名,而是告诉 XML 解析器使用一个或多个 XSD 文件的目录进行验证。

我尝试创建一个 DocumentBuilder 提供程序(针对 Guice 3.0)如下所示:

public class ValidatingDocumentBuilderProvider implements
Provider<DocumentBuilder> {

static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";

Logger log = getLogger(ValidatingDocumentBuilderProvider.class);

DocumentBuilderFactory dbf;

public synchronized DocumentBuilder get() { // dbf not thread-safe

if (dbf == null) {
log.debug("Setting up DocumentBuilderFactory");

// http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPDOM8.html
dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
// parser should look for schema reference in xml file

// Find XSD's in current directory.

FilenameFilter fileNameFilter = new FilenameFilter() {

public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".xsd");
}
};
File[] schemaFiles = new File(".").listFiles(fileNameFilter);

dbf.setAttribute(JAXP_SCHEMA_SOURCE, schemaFiles);

log.debug("{} schema files found", schemaFiles.length);
for (File file : schemaFiles) {
log.debug("schema file: {}", file.getAbsolutePath());
}

}

try {
return dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException("get DocumentBuilder", e);
}
}
}

(我也尝试过使用文件名)。 Eclipse 接受 XSD - 当放入目录中时,它可以验证此处处理的 XML

肉眼看来,解析器在尝试验证时会短暂停止。这可能是网络查找。

-Djaxp.debug=1 仅添加这些行

JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
JAXP: loaded from fallback value: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
JAXP: created new instance of class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null

如何让 JDK 6 中的解析器告诉我它在做什么?如果我不能这样做,我如何检查其中的 XML 目录使用情况以了解为什么未选择提供的 XSD?

我忽略了哪些明显的事情?

最佳答案

你说

We would like to avoid having the file name explicitly mentioned in the XML file

那么解析器如何能够选择适当的模式?

您可以尝试的是使用 SchemaFactory 基于所有可用的架构资源创建一个 Schema,并将其附加到文档生成器工厂。然后,解析器将根据此“ super 模式”自动验证文档。

如果您的架构集具有内部依赖关系(即导入或包含),请确保使用相对 URL 或专用解析器正确解析这些引用。

更新:

读完本文后,http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPDOM8.html ,更仔细一点,我意识到你的方法应该与我的建议具有相同的效果,所以其他事情正在发生。我只能说我描述的效果很好。

关于java - JAXP - 调试 XSD 目录查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7632422/

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