我有一个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,这可能会这样做吗?
答案 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。