Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中使用String.intern()和传递String对象会得到不同的结果?_Java - Fatal编程技术网

为什么在Java中使用String.intern()和传递String对象会得到不同的结果?

为什么在Java中使用String.intern()和传递String对象会得到不同的结果?,java,Java,我有一个命令行程序来根据XSD文件验证XML。此程序的命令行选项之一是要使用的名称空间,它存储在字符串名称空间中。我会得到不同的验证结果,这取决于我是将解析后的选项作为namespace传递,还是将调用传递到namespace.intern()。不同的结果意味着在XML验证器中的某个地方,对命名空间执行的字符串比较有不同的结果,即使它们应该具有相同的ASCII值集 有没有一个根本的原因,为什么这些可能会产生不同的比较结果 NamespaceFilter类(见下文)是使用名称空间值的地方。此类将名

我有一个命令行程序来根据XSD文件验证XML。此程序的命令行选项之一是要使用的名称空间,它存储在
字符串名称空间
中。我会得到不同的验证结果,这取决于我是将解析后的选项作为
namespace
传递,还是将调用传递到
namespace.intern()
。不同的结果意味着在XML验证器中的某个地方,对命名空间执行的
字符串
比较有不同的结果,即使它们应该具有相同的ASCII值集

有没有一个根本的原因,为什么这些可能会产生不同的比较结果

NamespaceFilter
类(见下文)是使用名称空间值的地方。此类将
名称空间
startElement
中当前元素上的值进行比较,然后将其赋值<代码>startElement由XML读取器调用

以下是validateAgainstXSD中的行变体:

String.intern()

NamespaceFilter nsf=newnamespacefilter(XMLReaderFactory.createXMLReader(),namespace.intern())

结果:
正在验证uart.xml

字符串对象原样
NamespaceFilter nsf=新的NamespaceFilter(XMLReaderFactory.createXMLReader(),名称空间)

结果:
错误位于4:cvc复杂类型。2.4.a:发现以元素“fileVersion”开头的无效内容。应为“{”myNamespace“:fileVersion}”之一

上下文中的源
您还需要重写
endElement()
,其中包含类似的逻辑。否则,开始和结束元素URI可能不匹配
XMLFilterImpl
可能在==而不是.equals()上匹配它们。

如果这对您来说很明显,您能解释一下吗?您是否检查了行
uri=requiredNamespace使用插入的字符串执行?我怀疑你的问题就在这里。@Jochen你评论中的这句话在两种情况下都被执行了。干得好,谢谢!我认为XMLFilterImpl就是这种情况,对我来说这似乎是一个bug。
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 = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace.intern());

        // Load the XML source
        SAXSource source = new SAXSource(nsf, new InputSource(new FileInputStream(file)));

        validator.validate(source, null);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

private static class NamespaceFilter extends XMLFilterImpl {

    private String requiredNamespace;

    public NamespaceFilter(XMLReader parent) {
        super(parent);
    }

    public NamespaceFilter(XMLReader parent, String namespace) {
        this(parent);

        requiredNamespace = namespace;
    }

    @Override
    public void startElement(String uri,
            String localName,
            String qName,
            Attributes atts)
            throws SAXException {

        if (!uri.equals(requiredNamespace)) {
            uri = requiredNamespace;
        }
        super.startElement(uri, localName, qName, atts);

    }
}