1

以下のような XML ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>  
<a>  
<b id="1">xxx</b>
<b id="2">yyy</b>
<b id="3">zzz</b>
</a>  

StAXパーサーの<b id="4">ddd</b>後に要素(例)を追加する方法はありますか? <b id="3">zzz</b>私が考えたアプローチは、以下のように XML の最初の部分を新しいファイルに書き込むことです。

<?xml version="1.0" encoding="UTF-8"?>  
<a>  
<b id="1">xxx</b>
<b id="2">yyy</b>
<b id="3">zzz</b>

しかし、最後の要素 ( ) の直後に記述する解決策がわかりません<b id="3">zzz</b>。出力用に新しいファイルを再度開く必要がありますか? StAXを使用してそれを行うことは可能ですか?

4

2 に答える 2

0

自分でそれを行う方法の例:

public static void addElementToXML(String value){

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = null;
      Document doc = null;
      try {

        String filePath = "D:\\Loic_Workspace\\Test2\\res\\test.xml";
        db = dbf.newDocumentBuilder();
        doc = db.parse(new File(filePath));
        NodeList ndListe = doc.getElementsByTagName("b");

        Integer newId = Integer.parseInt(ndListe.item(ndListe.getLength()-1).getAttributes().item(0).getTextContent()) + 1;

        String newXMLLine ="<b id=\""+newId+"\">"+StringEscapeUtils.escapeXml(value)+"</b>";

        Node nodeToImport = db.parse(new InputSource(new StringReader(newXMLLine))).getElementsByTagName("b").item(0);

        ndListe.item(ndListe.getLength()-1).getParentNode().appendChild(doc.importNode(nodeToImport, true));

          TransformerFactory tFactory = TransformerFactory.newInstance();
          Transformer transformer = tFactory.newTransformer();
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");  

          DOMSource source = new DOMSource(doc);
          StreamResult result = new StreamResult(new StringWriter());

         transformer.transform(source, result);


          Writer output = new BufferedWriter(new FileWriter(filePath));
          String xmlOutput = result.getWriter().toString();  
          output.write(xmlOutput);
          output.close();


      } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TransformerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

CommonsLangのStringEscapeUtilsメソッドを使用したことに注意してください。

XMLManager.addElementToXML("& dqsd apzeze /<>'");

前のファイル:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>  
<b id="1">xxx</b>
<b id="2">yyy</b>
<b id="3">zzz</b>
</a>

後のファイル:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<a>  
<b id="1">xxx</b>
<b id="2">yyy</b>
<b id="3">zzz</b>
<b id="4">&amp; dqsd apzeze /&lt;&gt;'</b>
</a>
于 2013-02-04T05:58:18.093 に答える