簡體   English   中英

為什么我使用String.intern()與在Java中傳遞String對象獲得不同的結果?

[英]Why do I get different results with String.intern() vs. passing String object in Java?

我有一個命令行程序來根據XSD文件驗證XML。 此程序的命令行選項之一是要使用的名稱空間,該String namespace存儲在String namespace 我得到一個不同的驗證結果取決於我是否將解析的選項作為namespace傳遞或將調用傳遞給namespace.intern() 不同的結果意味着在XML驗證器中的某處,對命名空間執行的String比較具有不同的結果,即使它們應具有相同的ASCII值集。

有沒有一個根本原因可能會產生不同的比較結果?

NamespaceFilter類(見下文)是使用命名空間值的位置。 此類將namespacestartElement當前元素上找到的值進行比較,然后分配它。 startElement由XML閱讀器調用。

以下是validateAgainstXSD中的行變化:

String.intern()

NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace.intern());

結果
驗證uart.xml。

String對象不變

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 = 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);

    }
}

您還需要覆蓋endElement() ,其中包含類似的邏輯。 否則,start和end元素URI可能不匹配。 XMLFilterImpl可能在==而不是.equals()上匹配它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM