Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中更新xml文件_Java_Xml - Fatal编程技术网

如何在java中更新xml文件

如何在java中更新xml文件,java,xml,Java,Xml,我有一个xml文件,名为data.xml,如下代码所示。项目可以从客户端运行,没有问题,并且可以读取xml文件。我现在的问题是我想写一个函数来更新startdate和enddate。我不知道如何开始。我们将不胜感激 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <data> <username>admin</username> <password&

我有一个xml文件,名为data.xml,如下代码所示。项目可以从客户端运行,没有问题,并且可以读取xml文件。我现在的问题是我想写一个函数来更新startdate和enddate。我不知道如何开始。我们将不胜感激

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

管理
12345
1.
90
01/01/2013
06/01/2013
1110
my 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);

    }
公共类主
{
公共静态void main(字符串[]args)
{
日历cal2=null;
试试{
//阅读xml
文件数据=新文件(“data.xml”);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
Document doc=dBuilder.parse(数据);
doc.getDocumentElement().normalize();
对于(inti=0;i
从加载XML文件开始

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder b = f.newDocumentBuilder();
Document doc = b.parse(new File("Data.xml"));
现在,有几种方法可以做到这一点,但很简单,您可以使用XPathAPI查找所需的节点并更新其内容

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");
然后将
文档
保存回文件

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

首先,您的XML中有一个错误,您有一个额外的
标记。我已经删除了它。现在您有两个选项,可以使用
SAX
DOM
。我建议
DOM
原因是,您可以使用
DOM
读取完整的XML,对于这样一小段XML,它是更好的选择

代码

更正的XML

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

管理
12345
1.
90
29/07/2015
06/01/2013
1110

这是我尝试更新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");
以下是我使用的XML文件:

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

希望有帮助!

库可以将xml读取到链接的哈希映射,并在修改后重新生成xml。我是项目的维护者

导入com.github.underline.lodash.U;
公共类MyClass{
公共静态void main(字符串参数[]){
字符串xml=“”
+ ""
+“管理员”
+ "       12345"
+ "       1"
+ "       90"
+ "       01/01/2013"
+ "       06/01/2013"
+ "       1110"
+ "    ";  
java.util.Map object=U.fromXmlMap(xml);
U.set(对象,“数据起始日期”,“2013年2月2日”);
U.set(对象,“数据截止日期”,“2013年2月7日”);
System.out.println(U.toXml(object));
}
}
// 
// 
//管理员
//   12345
//   1
//   90
//   02/02/2013
//   07/02/2013
//   1110
// 

至少让你的代码看看你尝试了什么Hi Shahzeb,谢谢你的回答,我已经让xml部分正常工作了。现在,如果我想更新startdate的月增长率,比如2015年7月29日、2015年8月29日、2015年10月20日……诸如此类,我应该怎么做?我应该创建一个方法来做吗?你能提供一个例子吗?我的答案已经做到了。请尝试我在这里给出的代码。在我的答案中,我只更新了
startdate
,您可以在默认情况下添加
enddate
@gaurav,但您可以将其放在线程安全方法中。感谢您的回答,我已经让xml部分正常工作了。现在,如果我想更新startdate的每月增加一次,比如2015年7月29日、2015年8月29日、2015年10月20日……像这样,我应该怎么做?我应该创建一个方法来做吗?你能提供一个例子吗?你可以简单地使用Java 8的时间API,它具有简单易用的操作、解析和格式化功能。你能提供一个例子吗?类似于Hi的东西,谢谢r您的回答,现在我已经更新了我的答案,您将如何将其应用到我的代码中?我使用Dom解析器而不是XPath。谢谢
<!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 -->
import com.github.underscore.lodash.U;

public class MyClass {
    public static void main(String args[]) {
        String xml = "<?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>";  
        java.util.Map<String, Object> object = U.fromXmlMap(xml);
        U.set(object, "data.startdate", "02/02/2013");
        U.set(object, "data.enddate", "07/02/2013");
        System.out.println(U.toXml(object)); 
    }
}

// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
// <data>
//   <username>admin</username>
//   <password>12345</password>
//   <interval>1</interval>
//   <timeout>90</timeout>
//   <startdate>02/02/2013</startdate>
//   <enddate>07/02/2013</enddate>
//   <ttime>1110</ttime>
// </data>