2016-07-11 12 views
0

Ich versuche, ein <div>-Tag durch ein <span>-Tag in einem DOM-Dokument zu ersetzen, das aus einer XHTML-Zeichenfolge mit der Node.replaceChild-Methode erstellt wird. Beide Tags haben das gleiche Stilattribut style="color: blue;", aber mein Code funktioniert nur wie erwartet, wenn ich eine nutzlose Codezeile auskommentiere, die auf den Inhalt des Stilattributs zugreift. Dies ist mein Testcode:Warum die DOM Node.replaceChild() -Methode in diesem Anwendungsfall nicht funktioniert?

public class DomTest { 

    public static void main(String args[]) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException, TransformerException { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader( 
        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " 
       + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" 
       + "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" 
       + " <head>\n" 
       + "   <title>Title</title>\n" 
       + " </head>\n" 
       + " <body>\n" 
       + "   <div style=\"color: blue;\">Content</div>\n"    
       + " </body>\n" 
       + "</html>")));  

     Element element = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(
       "<span style=\"color: blue;\">content</span>"))).getDocumentElement(); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 

     Node parentNode = (Node) xPath.compile("/html[1]/body[1]") 
       .evaluate(doc, XPathConstants.NODE); 

     Node childNode = (Node) xPath.compile("/html[1]/body[1]/div[1]") 
       .evaluate(doc, XPathConstants.NODE); 

     // element.getAttributes().item(0).getNodeValue(); 

     doc.adoptNode(element);  
     parentNode.replaceChild(element, childNode); 

     DOMSource domSource = new DOMSource(doc);  
     StringWriter writer = new StringWriter(); 
     StreamResult result = new StreamResult(writer); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer();  
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
     transformer.transform(domSource, result);    

     System.out.println(writer.toString());  
    } 
} 

Wenn diese Zeile kommentiert ist, wird das Stilattribut entfernt. Wie erklärt man dieses seltsame Verhalten?

Ausgang mit der Linie kommentiert:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
      <title>Title</title> 
    </head> 
    <body> 
      <span style="">Content</span> 
    </body> 
</html> 

Ausgang mit der Linie unkommentiert:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
      <title>Title</title> 
    </head> 
    <body> 
      <span style="color: blue">Content</span> 
    </body> 
</html> 

Antwort

Verwandte Themen