2

xml 文字列ファイルの 2 行目に xml-stylesheet を追加したい xml 文字列ファイルがあります。しかし、以下に示すコードは、次のような出力を提供します。最初にxml-stringファイルを追加し、次にxml-stylesheetをxml stringファイルの最後に追加しますが、xml-stringの2番目の行にスタイルシートが必要です。提案してください私はこれをどうすればいいですか。ありがとう。

私のコードは次のとおりです。

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

1 に答える 1

1

ステートメントElement root = doc.createElement("root-element");はという名前の新しい要素を作成し、root-element呼び出すと、doc.appendChild(root);実際にはドキュメントの最後に追加されます。したがって、これら 2 つのステートメントの後、ドキュメントは次のようになります。

<?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);、この新しく追加された要素の直前にスタイルシート処理命令を追加する理由があります。

これを修正するには、( という名前の新しい要素を追加する代わりに) ドキュメント ルート要素へのポインターを取得し、root-elementその直前に pi を追加する必要があります。これは、オブジェクトgetDocumentElement()のメソッドを呼び出すことで可能になります。docしたがって、問題を解決するには、mainメソッドで次のコードを使用するだけです。

Element root = doc.getDocumentElement();
doc.insertBefore((Node) pi, root);
于 2013-10-06T21:36:24.010 に答える