Domanda

Devo elaborare un DOM XML, preferibilmente con Jdom, dove posso fare la ricerca XPath sui nodi. Conosco i nomi o i percorsi dei nodi, ma voglio ignorare gli spazi dei nomi completamente Perché a volte il documento viene fornito con spazi dei nomi, a volte senza, e non posso fare affidamento su valori specifici. È possibile? Come?

È stato utile?

Soluzione

So che questa domanda è un po 'vecchia, ma per coloro che lo vedono in seguito, puoi sovrascrivere alcune classi predefinite di Jdom per farlo ignorare efficacemente anche gli spazi dei nomi. Puoi passare la tua implementazione JdomFactory al saxbuilder che ignora tutti i valori dello spazio dei nomi trasmessi in esso.

Quindi sovrascrivere la classe Saxbuilder e implementare il metodo CreateContentHandler in modo che restituisca un SaxHandler con una definizione vuota per il metodo StartPrefixMapping.

Non l'ho usato in un ambiente di produzione, quindi Avvertice Emptor, ma ho verificato che funziona su alcune cose XML veloci e sporche che ho fatto.

Altri suggerimenti

/ns:foo/ns:bar/@baz

diventa

/*[local-name() = 'foo']/*[local-name() = 'bar']/@baz

Ottieni il punto. Non aspettarti che sia nemmeno un fulmine.

Ecco una soluzione Jdom2 che ha sono in esecuzione in un ambiente di produzione per un anno senza problemi.

public class JdomHelper {

    private static final SAXHandlerFactory FACTORY = new SAXHandlerFactory() {
        @Override
        public SAXHandler createSAXHandler(JDOMFactory factory) {
            return new SAXHandler() {
                @Override
                public void startElement(
                        String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
                    super.startElement("", localName, qName, atts);
                }
                @Override
                public void startPrefixMapping(String prefix, String uri) throws SAXException {
                    return;
                }
            };
        }
    };


    /** Get a {@code SAXBuilder} that ignores namespaces.
     * Any namespaces present in the xml input to this builder will be omitted from the resulting {@code Document}. */
    public static SAXBuilder getSAXBuilder() {
        // Note: SAXBuilder is NOT thread-safe, so we instantiate a new one for every call.
        SAXBuilder saxBuilder = new SAXBuilder();
        saxBuilder.setSAXHandlerFactory(FACTORY);
        return saxBuilder;
    }

}

Puoi usare /*:foo (Xpath 2.0 o superiore) o /yournamespace:* come spiegato qui.

La prima variante seleziona tutti i nodi con il nome corrispondente, indipendentemente dallo spazio dei nomi a cui appartengono, incluso non avere uno spazio dei nomi. Quest'ultimo seleziona tutti i nodi appartenenti a uno spazio dei nomi specifico, indipendentemente dal nome del nodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top