Pergunta

Eu vou apontar agora, que eu sou novo para usar saxão, e eu tentei seguir os docs e exemplos no pacote, mas eu não estou tendo sorte com este problema.

Basicamente, eu estou tentando fazer algum processamento XML em java usando v8 saxão. A fim de obter algo de trabalho, tomei um dos arquivos de amostra incluídos no pacote e modificadas para minhas necessidades. Ele funciona, desde que eu não estou usando namespaces, e que é a minha pergunta. Como posso contornar o problema namespace? Eu realmente não me importo de usá-lo, mas ele existe na minha xml, então eu quer ter de usá-lo ou ignorá-lo. De qualquer solução está bem.

De qualquer forma, aqui está o meu código inicial. Ele não faz nada, mas tomar um XPath consulta tentar usá-lo contra o disco doc xml codificada.

public static void main(String[] args) {
    String query = args[0];

    File XMLStream=null;
    String xmlFileName="doc.xml";
    OutputStream destStream=System.out;
    XQueryExpression exp=null;
    Configuration C=new Configuration();
    C.setSchemaValidation(false);
    C.setValidation(false);

    StaticQueryContext SQC=new StaticQueryContext(C);
    DynamicQueryContext DQC=new DynamicQueryContext(C);      
    QueryProcessor processor = new QueryProcessor(SQC);
    Properties props=new Properties();
    try{   
        exp=processor.compileQuery(query);
        XMLStream=new File(xmlFileName);
        InputSource XMLSource=new InputSource(XMLStream.toURI().toString());
        SAXSource SAXs=new SAXSource(XMLSource); 
        DocumentInfo DI=SQC.buildDocument(SAXs);
        DQC.setContextNode(DI);

        SequenceIterator iter = exp.iterator(DQC);
        while(true){
            Item i = iter.next();
            if(i != null){
                System.out.println(i.getStringValue());
            }
            else break;
        }
    }
    catch (Exception e){
        System.err.println(e.getMessage());
    }
}   

Um exemplo de arquivo XML está aqui ...

<?xml version="1.0"?>
<ns1:animal xmlns:ns1="http://my.catservice.org/">
    <cat>
        <catId>8889</catId>
        <fedStatus>true</fedStatus>
    </cat>
</ns1:animal>

Se eu executar isso com uma consulta incluindo o namespace, eu recebo um erro. Por exemplo: /ns1:animal/cat/ dá o erro:. "Prefixo NS1 não foi declarado"

Se eu remover o ns1: a partir da consulta, ele me dá nada. Se eu medicar o xml para remover o "ns1:". Prefixado para "animal" Eu posso correr o /animal/cat/ consulta com sucesso

Qualquer ajuda seria muito apreciada. Obrigado.

Foi útil?

Solução

Mensagem de erro corretamente aponta que a sua expressão XPath não indicar o prefixo de namespace significa "NS1" (liga-se). Só porque documento para operar passa a utilizar a ligação para "ns1" não significa que é o que deve ser utilizado:. Isso porque em XML, é o namespace URI que importa, e prefixos são apenas atalhos convenientes para a coisa real

Assim: como você define a ligação? Existem 2 maneiras genéricos; quer proporcionar um contexto que pode resolver o prefixo, ou incorporar real URI dentro expressão XPath.

Em relação à primeira abordagem, este email de Saxon autor menciona JAXP método XPath.setNamespaceContext (), Da mesma forma, Jaxen XPath processador FAQ tem um código de exemplo que poderia ajudar Isso não é muito conveniente, como você tem que implementar NamespaceContext, mas uma vez que você tem uma implementação você vai ser definido.

Portanto, a abordagem notação ... vamos ver: Top Ten Dicas para Usando mostra XPath e XPointer este exemplo:

para combinar elemento declarado com namespace como:

xmlns: livro = "http://my.example.org/namespaces/book"

Você usar o nome XPath como:

http://my.example.org/namespaces/book } seção

que esperamos que se entende por Saxon (ou Jaxen).

Finalmente, eu recomendo a atualização para o Saxon9 se possível, se você tiver qualquer problema usando um dos acima soluções.

Outras dicas

Se você quer ter algo a trabalhar fora da caixa, você pode verificar embutindo-xquery-in-java . Há projeto github, que usa Saxon para avaliar algumas expressões amostra XQuery.

Saudações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top