2011-01-12 34 views
12

Tôi có một tệp XML và tôi biết tên nút mà tôi cần phải thay đổi giá trị cho.Cách tốt nhất để thay đổi một giá trị trong các tệp XML trong Java là gì?

Tên nút là ipAddress.

Tôi có thể sử dụng JDOM, lấy tài liệu, nhận nút và thay đổi giá trị và viết nó hoặc tôi có thể viết một tệp XSLT.

Giá trị thay đổi mã đi từ Java, vì vậy câu hỏi của tôi là tùy chọn nào tốt hơn? Kích thước của tệp XML có thể khác nhau.

Một câu hỏi khác liên quan đến XSLT: Có thể viết tệp XSLT sao cho tôi sẽ không liệt kê tất cả các nút trong XML nhưng sẽ chỉ định như if node == ipAddress, sau đó lấy giá trị mới và cách áp dụng XSLT chuyển đổi từ Java?

Cảm ơn bạn.

+1

Tốt câu hỏi, 1. Xem câu trả lời của tôi cho một giải pháp XSLT hoàn chỉnh và một liên kết đến tài liệu của một trong những bộ xử lý XSLT dựa trên Java tốt nhất. –

+0

Bạn có ý nghĩa gì bởi "tốt nhất"? Thuận tiện nhất (đơn giản nhất), hiệu suất nhất, có thể sử dụng cho các tệp lớn? XSLT và các mô hình cây (DOM) có thể thuận tiện, nhưng cũng sử dụng rất nhiều bộ nhớ và tương đối chậm (ví dụ). – StaxMan

+0

Saxon là khá tốt nhất. Nó có mô hình bộ nhớ trong DOM nhỏ hơn, hỗ trợ phát trực tuyến các tệp lớn, có trình tối ưu hóa đặc biệt và hỗ trợ XSLT 1, XSLT 2, XQuery, XML Schema và hỗ trợ một số tiêu chuẩn dự thảo mới hơn. – lavinio

Trả lời

6

Bạn có thể sử dụng API org.w3c.dom tiêu chuẩn để nhận DOM. Sau đó lấy nút bằng cách sử dụng các API javax.xml.xpath tiêu chuẩn. Và sau đó sử dụng các API javax.xml.transform để viết nó trở lại.

Cái gì như:

import java.io.File; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     Document document = dbf.newDocumentBuilder().parse(new File("input.xml")); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     XPathExpression expression = xpath.compile("//A/B[C/E/text()=13]"); 

     Node b13Node = (Node) expression.evaluate(document, XPathConstants.NODE); 
     b13Node.getParentNode().removeChild(b13Node); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     t.transform(new DOMSource(document), new StreamResult(System.out)); 
    } 
} 
4

giải pháp XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="pNewIpAddress" select="'192.68.0.1'"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ipAddress/text()"> 
    <xsl:value-of select="$pNewIpAddress"/> 
    </xsl:template> 
</xsl:stylesheet> 

Khi chuyển đổi này được áp dụng trên bất kỳ tài liệu, tất cả các nút của tài liệu được sao chép "như nó vốn có" trừ con nút văn bản của bất kỳ phần tử ipAddress (bất kể phần tử này nằm trong tài liệu). Cái sau được thay thế bằng giá trị của một tham số được cung cấp bên ngoài, có tên là $pNewIpAddress.

Ví dụ, nếu việc chuyển đổi được áp dụng đối với tài liệu này XML:

<t> 
    <a> 
     <b> 
      <ipAddress>127.0.0.1</ipAddress> 
     </b> 
     <c/> 
    </a> 
    <d/> 
</t> 

các truy nã, kết quả chính xác được sản xuất:

<t> 
    <a> 
     <b> 
     <ipAddress>192.68.0.1</ipAddress> 
     </b> 
     <c/> 
    </a> 
    <d/> 
</t> 

Có rất nhiều dựa trên nền Java XSLT bộ vi xử lý và vị trí thích hợp để hiểu cách chúng có thể được gọi từ Java là tài liệu của chúng. Một trong những bộ xử lý XSLT như vậy tốt nhất là Saxon và tài liệu của nó có thể được tìm thấy tại địa chỉ:

http://www.saxonica.com/documentation/documentation.xml

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Bạn có biết nếu tôi có thể vượt qua giá trị của địa chỉ ip mới thông qua biến từ mã java như transformer.transform (xml, xslt, variable) vì vậy tôi sẽ không chỉ định nó trong tệp xslt trực tiếp vì giá trị được tính toán động? – yart

+0

@yart: Có. Xem tài liệu về Saxon tại đây: http://www.saxonica.com/documentation/using-xsl/embedding.xml –

Các vấn đề liên quan