2014-05-09 51 views
0

XML文件的簡單修改我有以下結構的XML文件:使用Java

<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 

我所要做的是修改版-ID只的資源之一。這樣做最好的方法是什麼?這有可能做到沒有每個資源有一個ID?

+0

使用任何適用於java的XML處理API。至於是否可能沒有資源ID,只有在您可以確切知道資源將在何種順序出現的情況下。 –

回答

0

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

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,NodeList,NamedNodeMap,Element。

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 s的值的兄弟節點設置爲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;