我有一个命令行程序来根据XSD文件验证XML.此程序的命令行选项之一是要使用的命名空间,存储在其中String namespace.我得到一个不同的验证结果取决于我是否将解析的选项作为namespace传递或传递给namespace.intern().不同的结果意味着在XML验证器中的某处,String对命名空间执行的比较具有不同的结果,即使它们应具有相同的ASCII值集.
有没有一个根本原因可能会产生不同的比较结果?
该NamespaceFilter班,看到下面,是被使用的命名空间值,其中.此类与namespace在当前元素内找到的值进行比较startElement,然后分配它. startElement由XML阅读器调用.
以下是validateAgainstXSD中的行变化:
String.intern()NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace.intern());
结果:
验证uart.xml.
NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace);
结果:
错误为4:cvc-complex-type.2.4.a:从元素'fileVersion'开始发现无效内容.其中一个'{"myNamespace":fileVersion}'是预期的.
public static void validateAgainstXSD(File file, File schemaFile, String namespace) {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
ErrorHandler eh = new DefaultErrorHandler();
validator.setErrorHandler(eh);
// Create namespace replacement filter
NamespaceFilter nsf = …Run Code Online (Sandbox Code Playgroud) 我指的是 Joshua Bloch 在 Effective Java 第 34 条中的范式。我想采用他正在使用的方法,即让每个相关enum实现一个基本接口,并EnumMap从“子枚举”初始化一个。请参阅下面的代码部分。我收到一个我不明白的语法错误。我没有设置这种实施方法,但我想了解为什么它不起作用。
请注意,此示例假定每个类定义都在其自己的文件中。
public interface BaseEnum {
...
}
public enum EnumOps1 implements BaseEnum {
...
}
public class Widget {
public Widget() {
regMap = new EnumMap<EnumOps1, WidgetData>(EnumOps1.class);
for (EnumOps1 op : EnumOps1.values()) {
regMap.put(op, getWidgetData(op.key())); // line with syntax error
}
}
protected Map<? extends BaseEnum, WidgetData> regMap;
}
Run Code Online (Sandbox Code Playgroud)
语法错误详情:
接口 java.util.Map 中的
<K,V>方法不能应用于
所需的给定类型:capture#1 of ? 扩展 BaseEnum、WidgetData
找到:EnumOps1、WidgetData