J'ai un fichier xml appelé data.xml comme le code ci-dessous. Le projet peut s'exécuter du côté client sans problème et il peut lire le fichier xml. Le problème que j'ai maintenant, c'est que je veux écrire une fonction qui peut mettre à jour la date de début et la date de fin. Je n'ai aucune idée de comment commencer. Votre aide sera appréciée.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<username>admin</username>
<password>12345</password>
<interval>1</interval>
<timeout>90</timeout>
<startdate>01/01/2013</startdate>
<enddate>06/01/2013</enddate>
<ttime>1110</ttime>
</data>
mon main.Java
public class main
{
public static void main(String[] args)
{
Calendar cal2 =null;
try {
//read the xml
File data = new File("data.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(data);
doc.getDocumentElement().normalize();
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
username = getValue("username", element);
startdate = getValue("startdate", element);
enddate = getValue("enddate", element);
}
}
date = startdate;
Date date_int = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(date);
cal2 = Calendar.getInstance();
cal2.setTime(date_int);
//loop the child node to update the initial date
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
setValue("startdate", element , date_int.toString());
}
}
//write the content in xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("data.xml"));
transformer.transform(source, result);
} catch (Exception ex) {
log.error(ex.getMessage());
ex.printStackTrace();
}
}
private static void setValue(String tag, Element element , String input) {
NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = (Node) nodes.item(0);
node.setTextContent(input);
}
Premièrement, il y a une erreur dans votre XML, vous avez <data>
tag. Je l'ai retiré. Vous avez maintenant deux options que vous pouvez utiliser SAX
ou DOM
. Je suggérerais DOM
parce que vous pouvez lire le XML complet en utilisant DOM
et pour un petit morceau de XML comme celui-ci, c'est un meilleur choix.
Code
import Java.io.File;
import Java.io.IOException;
import Java.text.DateFormat;
import Java.text.SimpleDateFormat;
import Java.util.Calendar;
import Java.util.Date;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class ModifyXMLFile {
public static void main(String argv[]) {
try {
String filepath = "file.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
// Get the root element
Node data= doc.getFirstChild();
Node startdate = doc.getElementsByTagName("startdate").item(0);
// I am not doing any thing with it just for showing you
String currentStartdate = startdate.getNodeValue();
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date today = Calendar.getInstance().getTime();
startdate.setTextContent(df.format(today));
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
transformer.transform(source, result);
System.out.println("Done");
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException 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();
}
}
}
XML corrigé
<?xml version="1.0" encoding="UTF-8"?>
<data>
<username>admin</username>
<password>12345</password>
<interval>1</interval>
<timeout>90</timeout>
<startdate>29/07/2015</startdate>
<enddate>06/01/2013</enddate>
<ttime>1110</ttime>
</data>
Commencez par charger le fichier XML ...
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder b = f.newDocumentBuilder();
Document doc = b.parse(new File("Data.xml"));
Maintenant, il existe plusieurs façons de le faire, mais simplement, vous pouvez utiliser l'API xpath pour trouver les nœuds que vous souhaitez et mettre à jour leur contenu
XPath xPath = XPathFactory.newInstance().newXPath();
Node startDateNode = (Node) xPath.compile("/data/startdate").evaluate(doc, XPathConstants.NODE);
startDateNode.setTextContent("29/07/2015");
xPath = XPathFactory.newInstance().newXPath();
Node endDateNode = (Node) xPath.compile("/data/enddate").evaluate(doc, XPathConstants.NODE);
endDateNode.setTextContent("29/07/2015");
Enregistrez ensuite le Document
dans le fichier ...
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.setOutputProperty(OutputKeys.METHOD, "xml");
tf.setOutputProperty("{http://xml.Apache.org/xslt}indent-amount", "4");
DOMSource domSource = new DOMSource(doc);
StreamResult sr = new StreamResult(new File("Data.xml"));
tf.transform(domSource, sr);
C'est un exemple que j'ai essayé pour mettre à jour les fichiers xml.
String filepath="Test.xml";
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filepath);
Node company = doc.getFirstChild();
/**
* Get the param from xml and set value
*/
Node search = doc.getElementsByTagName("parameter").item(0);
NamedNodeMap attr = search.getAttributes();
Node nodeAttr = attr.getNamedItem("value");
nodeAttr.setTextContent(param);
/**
* write it back to the xml
*/
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(filepath));
transformer.transform(source, result);
System.out.println("Done");
Voici le fichier XML que j'ai utilisé:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Testing" parallel="false">
<parameter name="Search" value="param1"></parameter>
<test name="TestParams" preserve-order="true">
<classes>
<class name="uiscreen.TestingParam"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
J'espère que cela aide!