java - studio - Declaración de espacio de nombres de arreglos XML
manual de programacion android pdf (2)
Probablemente puedas hacerlo con XSLT, con una regla como esta:
<xsl:template match="media:*">
<xsl:element name="local-name()" namespace="http://search.yahoo.com/mrss/">
<xsl:apply-templates match="node()|@*"/>
</xsl:element>
</xsl:template>
donde los medios están vinculados a " http://search.yahoo.com/mrss ".
Puede que tenga que modificar un poco la sintaxis, ya que estoy escribiendo esto sin la ayuda de un compilador. Además, lo que obtendrás probablemente no esté muy bien formateado (declaraciones de espacio de nombres en muchos elementos), pero debería ser locicamente correcto.
Estoy tratando de detectar / solucionar este error en los elementos RSS. Eso significa que tengo que encontrar una declaración de espacio de nombres incorrecta y cambiar su valor al espacio de nombres correcto. P.ej:
xmlns:media="http://search.yahoo.com/mrss"
debe ser:
xmlns:media="http://search.yahoo.com/mrss/"
¿Cómo puedo lograr eso dado un org.w3c.Document?
Quiero decir que descubrí cómo obtener todos los elementos de un determinado espacio de nombres:
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());
}
}
Así que ahora tengo que descubrir cómo cambiar el espacio de nombres de un nodo a través de JAXP.
Solo por el bien de la compleción:
Código de Java:
Document d = out.outputW3CDom(converted);
DOMSource oldDocument = new DOMSource(d);
DOMResult newDocument = new DOMResult();
TransformerFactory tf = TransformerFactory.newInstance();
StreamSource xsltsource = new StreamSource(
getStream(MEDIA_RSS_TRANSFORM_XSL));
Transformer transformer = tf.newTransformer(xsltsource);
transformer.transform(oldDocument, newDocument);
private InputStream getStream(String fileName) {
InputStream xslStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("/" + fileName);
if (xslStream == null) {
xslStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream(fileName);
}
return xslStream;
}
Hoja de estilo:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--identity transform that will copy matched node/attribute to the output and apply templates for it''s children and attached attributes-->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|*|text()" />
</xsl:copy>
</xsl:template>
<!--Specialized template to match on elements with the incorrect namespace and generate a new element-->
<xsl:template match="//*[namespace-uri()=''http://search.yahoo.com/mrss'']">
<xsl:element name="{local-name()}" namespace="http://search.yahoo.com/mrss/" >
<xsl:apply-templates select="@*|*|text()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Un agradecimiento especial a Mads Hansen por su ayuda con el XSLT.