Frage

Ich versuche, detetct / Arbeit um dieser Fehler in RSS-Elemente. Das Mittel muss ich einen falschen Namensraum-Deklaration finden und ändern ihre Wert auf den richtigen Namespace. Z. B:

xmlns:media="http://search.yahoo.com/mrss" 

muss sein:

xmlns:media="http://search.yahoo.com/mrss/" 

Wie kann ich achive, die gegeben eine org.w3c.Document?

Ich fand Meanwile, wie alle Elemente eines bestimmten Namensraum zu bekommen:

        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());
            }

        } 

So, jetzt muß ich herausfinden, wie der Namensraum eines Knotens über JAXP zu ändern.

War es hilfreich?

Lösung 2

Nur aus Gründen der Vollständigkeit halber:

Java-Code:

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;
    }

Sheet:

<?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>

Besonderer Dank geht an Mads Hansen für seine Hilfe mit dem XSLT.

Andere Tipps

Sie könnten wahrscheinlich tun es mit XSLT, mit in der Regel wie folgt aus:

<xsl:template match="media:*">
   <xsl:element name="local-name()" namespace="http://search.yahoo.com/mrss/">
      <xsl:apply-templates match="node()|@*"/>
   </xsl:element>
</xsl:template>

, wo Medien gebunden " http://search.yahoo.com/mrss ".

Sie haben möglicherweise die Syntax ein wenig zu optimieren, da ich dies schreibe ich ohne die Hilfe eines Compilers. Auch, was Sie bekommen, ist wahrscheinlich nicht sehr schön formatiert (Namespace-Deklarationen auf viele Elemente), aber es sollte locically korrekt sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top