使用Java简单修改XML文件

时间:2014-05-09 18:34:18

标签: java xml

我有一个xml文件,结构如下:

<jnlp>
 <resource>
   <pattern>
     <file>cisco-upgrade_v1_5.jar</file>
     <version-id>1.5</version-id>
   </pattern>
 </resource>
 <resource>
   <pattern>
     <file>commons-email_v1_1.jar</file>
     <version-id>1.1</version-id>
   </pattern>
 </resource>
 <resource>
   <pattern>
     <file>cnt_v1_1.jar</file>
     <version-id>1.1</version-id>
   </pattern>
 </resource>
</jnlp

我要做的是仅修改其中一个资源的version-id。这样做最好的方法是什么?如果每个资源都没有ID,这可能会这样做吗?

2 个答案:

答案 0 :(得分:2)

使用JDK提供的默认文档类非常简单。我更喜欢在这个特定的项目上使用XPath,因为它很容易适应DOM的变化。

首先解析您的文档并放入org.w3c.dom.Document班级

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new File("path to your file"));

然后我会创建我的XPath对象,它将获得我想要更改的项目的版本号。此XPath查询将查找version节点,其中名为file的兄弟节点的值设置为cisco-upgrade_v1_5.jar

XPath xPath = XPathFactory.newInstance().newXPath();
Node ciscoVersion = (Node)xPath.evaluate("/jnlp/resource/pattern/version-id[../file='cisco-upgrade_v1_5.jar']", 
    document.getDocumentElement(), 
    XPathConstants.NODE);

设置新版本号

ciscoVersion.setTextContent("1.5.2");

现在我们已经为cisco-upgrade_v1_5.jar条目更改了版本号,我们可以输出结果

TransformerFactory tranFactory = TransformerFactory.newInstance();  
Transformer aTransformer = tranFactory.newTransformer();  
Source src = new DOMSource(document);  
Result dest = new StreamResult(new FileOutputStream(new File("path to your file")));  
aTransformer.transform(src, dest);  

为方便起见,这里列出了实现此目的所需的导入

import java.io.File;
import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
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.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

答案 1 :(得分:0)

最好的方法之一,我知道使用的是SAX Parser。

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

是的,我们可以在没有id的情况下实现,但不能参考。

我的意思是说,我们甚至可以使用

获取元素
Node nodeRef  doc.getElementsByTagName("pattern")[0];// fetches the first record.

NodeList nodes = nodeRef.getChildNodes();//loop the nodes and find the matches to replace the text.

使用Node我们可以访问Elements,您可以在其中更改元素的内容。

详细了解 - Node,NodeList,NamedNodeMap,Element。