J'essaie de détecter/contourner this bug dans les éléments RSS. Cela signifie que je dois trouver une déclaration d'espace de nom incorrecte et modifier sa valeur pour l'espace de noms correct. Par exemple:Déclaration d'espace de noms XML fixe
xmlns:media="http://search.yahoo.com/mrss"
doit être:
xmlns:media="http://search.yahoo.com/mrss/"
Comment puis-je achive que, étant donné un org.w3c.Document?
Je Meanwile trouvé comment obtenir tous les éléments d'un certain espace de noms:
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
XPathExpression expr = xpath.compile("//*[namespace-uri()='http://search.yahoo.com/mrss']");
Object result = expr.evaluate(d, XPathConstants.NODESET);
if (result != null) {
NodeList nodes = (NodeList) result;
for(int node=0;node<nodes.getLength();node++)
{
Node n = nodes.item(node);
this.log.warn("Found old mediaRSS namespace declaration: "+n.getTextContent());
}
}
Alors maintenant, je dois comprendre comment changer l'espace de noms d'un nœud via JAXP.
Merci pour votre réponse. Cependant, j'accède au document au niveau de l'objet. Je ne suis pas sûr non plus si le préfixe local sera toujours "media:". Après tout ce sont RSS-Feeds faites par d'autres personnes. Dieu sait quel préfixe ils utilisent: -/ – er4z0r
Ils ne doivent pas! Vous pouvez utiliser n'importe quel préfixe dans le XSLT (par exemple "x: *"), tout ce qui compte est l'espace de noms. (En d'autres termes, le préfixe que vous utilisez dans XSLT n'a rien à voir avec le préfixe dans le fichier XML.) –
@ er4z0r - le préfixe d'espace de noms que vous déclarez dans votre XSLT (ie media) ne doit pas nécessairement correspondre au préfixe d'espace de noms dans le document source. Tant qu'ils se réfèrent tous les deux au même URI, le modèle correspondra. –