在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);
感谢我的问题是你solved.thank非常。 –