Saxon 8 (versão Java) problema
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.
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