Olá.
Estou com o seguinte problema, eu estou precisando recuperar a partir do nome da classe de um servlet o seu url-mapping.
Para isso decidi usar pesquisa com XPath no arquivo web.xml.
Para isso faço duas buscas:
uma com //servlet[servlet-class=‘AlgumServlet’] para pegar o nome do servlet no xml e outra com
e outra com //servlet-mapping[servlet-name=‘resultado da primeira busca’]
Até aqui tudo bem, só que quando uso o xpath com a seguinte tag no web.xml
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
ele fala que web-app é usado mas não declarado no DTD/Schema.
e isso faz com que minha busca não retorne porcaria nenhuma.
Já se eu diminuir o código para simplesmente
<web-app>
minha buscas funcionam sem problemas…
Eu pensei em pegar o arquivo web.xml, ir lendo ele e coloca-lo em uma array de bytes trocando essa linha, mas me pareceu uma tremenda gambiarra. Alguém tem uma sugestão mais elegante?
Há, eu estou usando a Classe XPath do pacote javax.xml.xpath.
[]'s
Bom, tive problemas parecido com esse e geralmente acontece pq o parser ñ encontra o DTD / Schema.
Vc tentou setar a validação de schema/dtd para false ?
Olá chicobento.
Não, eu nem sabia que dava para fazer isso. Poderia me dar um exemplo de como isso é feito?
Olá chicobento. Vlw pela resposta.
Não, eu nem sabia que dava para fazer isso :? Poderia me dar um exemplo de como isso é feito?
Opa. Vc pode enviar o codigo que vc usa para fazer o parser e a busca com o xpath ?
Meu código:
File webXml = new File("\\C:\\projetos\\Site\\web\\WEB-INF\\web.xml");
try {
FileReader fr = new FileReader(webXml);
InputSource is = new InputSource(fr);
//tentativa com xpath
javax.xml.xpath.XPathFactory xF = XPathFactory.newInstance();
javax.xml.xpath.XPath x = xF.newXPath();
Node node = (Node) x.evaluate("//servlet[servlet-class='nome da classe do meu servlet']", is, XPathConstants.NODE);
}
catch(Exception e)
{
e.printStackTrace();
}
Bom, resolvido o problema, vou postar aqui o código para quando alguém precisar, não esquecendo de dar os créditos para chicobento, que é o verdadeiro autor original do código e me ajudou pra caramba:
File webXml = new File("web\\WEB-INF\\web.xml");
System.out.println(webXml.exists());
DocumentBuilderFactory factory = DocumentBuilderFactoryImpl.newInstance() ;
factory.setValidating(false);
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);
DocumentBuilder docB;
try {
docB = factory.newDocumentBuilder();
Document doc = docB.parse(webXml);
XPathFactory xF = XPathFactory.newInstance();
XPath xp = xF.newXPath();
Node node = (Node) xp.evaluate("//servlet[servlet-class='classe do servlet']", doc, XPathConstants.NODE);
} catch (Exception ex) {
ex.printStackTrace();
}
[]'s e vlw