2013-01-31 35 views
1

我有类似下面的一个XML文件:如何使用StAX将元素添加到现有的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> 

有没有办法<b id="3">zzz</b>使用StAX解析器后添加的元素(例如<b id="4">ddd</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可以做到吗?

回答

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(); 
    } 




} 

请注意,我已经使用StringEscapeUtils方法从Commons Lang

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> 
0

是的,你需要一个临时文件写入。以下是StAX的一个示例:

Path in = Paths.get("file.xml"); 
Path temp = Files.createTempFile(null, null); 
XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 
try (FileWriter out = new FileWriter(temp.toFile())) { 
    XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(new FileReader(in.toFile())); 
    XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(out); 
    int depth = 0; 
    while (reader.hasNext()) { 
     XMLEvent event = reader.nextEvent(); 
     int eventType = event.getEventType(); 
     if (eventType == XMLStreamConstants.START_ELEMENT) { 
      depth++; 
     } else if (eventType == XMLStreamConstants.END_ELEMENT) { 
      depth--; 
      if (depth == 0) { 
       List<Attribute> attrs = new ArrayList<>(1); 
       attrs.add(eventFactory.createAttribute("id", "4")); 
       writer.add(eventFactory.createStartElement("", null, "b", attrs.iterator(), null)); 
       writer.add(eventFactory.createCharacters("ddd")); 
       writer.add(eventFactory.createEndElement("", null, "b")); 
       writer.add(eventFactory.createSpace(System.getProperty("line.separator"))); 
      } 
     } 
     writer.add(event); 
    } 
    writer.flush(); 
    writer.close(); 
} catch (XMLStreamException | FactoryConfigurationError e) { 
    throw new IOException(e); 
} 
Files.move(temp, in, StandardCopyOption.REPLACE_EXISTING); 
相关问题