java xml 更新节点_如何在xml java中更新节点值

我目前正在开发一个xml项目.到目前为止,我已经使用Dom Parser成功将我的xml链接到我的java类.我在下面提供了代码.我正在努力的是将我的startdate的月份更新为1,因此像这样的2/2 / 2013,3 / 1/2013 …将相应地在xml文件中更改.我在底部调用updateDate方法,但是当我调用它时,xml文件不会更新它的值.帮助将不胜感激

data.xml之前

hello123

01/01/2011

06/01/2013

渴望data.xml之后

hello123

02/01/2011

06/01/2013

main.java

public class main {

public static void main(String[] args) {

Calendar cal2 = null;

String username = null;

String startdate = null;

String enddate = null;

String date = null;

String date_end = null;

try {

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;

//end date

Date date_end = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(enddate);

Calendar end_date_cal = Calendar.getInstance();

end_date_cal.setTime(date_end);

// initial date

Date date_int = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(date);

cal2 = Calendar.getInstance();

cal2.setTime(date_int);

//call the method

updateDate(cal2);

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

System.out.println("Update Successfully");

}

} catch (Exception ex) {

log.error(ex.getMessage());

ex.printStackTrace();

}

}

private static void updateDate(Calendar cal2){

cal2.add(Calendar.MONTH, 1);

//need to push it back to the calendar

}

private static String getValue(String tag, Element element) {

NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();

Node node = (Node) nodes.item(0);

return node.getNodeValue();

}

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

}

}

解决方法:

Java 8的Time API

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");

LocalDate ld = LocalDate.parse("2/1/2013", formatter);

System.out.println("From " + formatter.format(ld));

ld = ld.plusMonths(1);

System.out.println("To " + formatter.format(ld));

哪个打印

From 2/1/2013

To 3/1/2013

但是,您永远不会将该值应用回XML文档.当我试图在你的previous question中演示时,你需要更改节点的textContent …

node.setTextContent(formatter.format(ld))

这就是为什么我建议使用xPath而不是走文档内容

例如…

import java.io.File;

import java.io.IOException;

import java.time.LocalDate;

import java.time.format.DateTimeFormatter;

import java.time.format.DateTimeParseException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.OutputKeys;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.TransformerFactoryConfigurationError;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import javax.xml.xpath.XPath;

import javax.xml.xpath.XPathConstants;

import javax.xml.xpath.XPathExpressionException;

import javax.xml.xpath.XPathFactory;

import org.w3c.dom.DOMException;

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.xml.sax.SAXException;

public class UpdateXML {

public static void main(String[] args) {

try {

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();

DocumentBuilder b = f.newDocumentBuilder();

Document doc = b.parse(new File("Data.xml"));

XPath xPath = XPathFactory.newInstance().newXPath();

Node startDateNode = (Node) xPath.compile("/data/startdate").evaluate(doc, XPathConstants.NODE);

startDateNode.setTextContent(addMonthTo(startDateNode.getTextContent()));

xPath = XPathFactory.newInstance().newXPath();

Node endDateNode = (Node) xPath.compile("/data/enddate").evaluate(doc, XPathConstants.NODE);

endDateNode.setTextContent(addMonthTo(endDateNode.getTextContent()));

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("AData.xml"));

tf.transform(domSource, sr);

} catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException | DOMException | TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException exp) {

exp.printStackTrace();

}

}

public static String addMonthTo(String value) {

String patterns[] = {"M/d/yyyy", "M/dd/yyyy", "MM/d/yyyy", "MM/dd/yyyy"};

LocalDate ld = null;

for (String pattern : patterns) {

try {

ld = LocalDate.parse(value, DateTimeFormatter.ofPattern(pattern));

break;

} catch (DateTimeParseException exp) {

}

}

if (ld == null) {

throw new DateTimeParseException("Could not parse " + value + " with available patterns", value, -1);

}

ld = ld.plusMonths(1);

return DateTimeFormatter.ofPattern("MM/dd/yyyy").format(ld);

}

}

哪个…

admin

12345

1

90

1/1/2013

06/01/2013

1110

并输出……

admin

12345

1

90

02/01/2013

07/01/2013

1110

i want the startdate 6 months earlier then the enddate

Java 8

String endDateValue = "07/01/2013";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");

LocalDate endDate = LocalDate.parse(endDateValue, formatter);

LocalDate startDate = endDate.minusMonths(6);

String startDateValue = formatter.format(startDate);

日历

我更喜欢Joda-Time,但是

String endDateValue = "07/01/2013";

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

Date endDate = sdf.parse(endDateValue);

Calendar cal = Calendar.getInstance();

cal.setTime(endDate);

cal.add(Calendar.MONTH, -6);

Date startDate = cal.getTime();

String startDateVaue = sdf.format(startDate);

标签:java,xml

来源: https://codeday.me/bug/20190609/1203731.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值