在seconed行的现有xml文件中添加xml样式表

问题描述:

我有xml字符串文件,我想在xml字符串文件的seconed行添加xml-stylesheet。 但下面给出的代码给我这样的输出: 首先xml-字符串文件,然后在xml字符串文件的末尾附加xml-stylesheet,但我想要我的xml字符串的seconed行的样式表。请告诉我该怎么做。 谢谢。在seconed行的现有xml文件中添加xml样式表

我的代码是:

public class StringToDocumentToString { 

public static void main(String[] args) 
     throws TransformerConfigurationException { 
    String xmlstring = null; 
    String filepath = "E:/C-CDA/MU2_CDA_WORKSPACE/AddingStylesheetTOxml/documentfile.txt"; 
    final String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" 
      + "<Emp id=\"1\"><name>Pankaj</name><age>25</age>\n" 
      + "<role>Developer</role><gen>Male</gen></Emp>"; 


    Document doc2 = convertStringToDocument(xmlStr); 
    Document doc1 = null; 
    try { 
     doc1 = addingStylesheet(doc2); 
    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String str = convertDocumentToString(doc1); 
    System.out.println(str); 
} 

private static <ProcessingInstructionImpl> Document addingStylesheet(
     Document doc) throws TransformerConfigurationException, 
     ParserConfigurationException { 

    ProcessingInstructionImpl pi = (ProcessingInstructionImpl) doc 
      .createProcessingInstruction("xml-stylesheet", 
        "type=\"text/xsl\" href=\"my.stylesheet.xsl\""); 
    Element root = doc.createElement("root-element"); 
    doc.appendChild(root); 

    doc.insertBefore((Node) pi, root); 
    return doc; 

} 

private static String convertDocumentToString(Document doc) { 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer; 
    try { 
     transformer = tf.newTransformer(); 
     // below code to remove XML declaration 
     // transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, 
     // "yes"); 
     StringWriter writer = new StringWriter(); 
     transformer.transform(new DOMSource(doc), new StreamResult(writer)); 
     String output = writer.getBuffer().toString(); 
     return output; 
    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

private static Document convertStringToDocument(String xmlStr) { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    Document doc = null; 
    try { 
     builder = factory.newDocumentBuilder(); 
     doc = builder.parse(new InputSource(new StringReader(xmlStr))); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return doc; 
} 
} 

声明Element root = doc.createElement("root-element");创建一个名为root-element新元素,当你调用doc.appendChild(root);你实际上它追加到文档的末尾。所以,这两个声明后,你的文件将是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<Emp id="1"> 
    <name>Pankaj</name> 
    <age>25</age> 
    <role>Developer</role> 
    <gen>Male</gen> 
</Emp> 
<root-element/> 

然后,你必须doc.insertBefore((Node) pi, root);导致眼前这个新添加的元素之前添加stylesheet处理指令。

要解决此问题,您必须检索指向文档根元素的指针(而不是添加名为root-element的新元素),然后在其之前添加pi。通过调用doc对象的方法getDocumentElement()可能会有这种情况。因此,为了解决这个问题,你只需要使用下面的代码在你main方法:

Element root = doc.getDocumentElement(); 
doc.insertBefore((Node) pi, root); 
+0

感谢我的问题是你solved.thank非常。 –