2011-01-12 72 views
12

Bir XML dosyanız var ve değerini değiştirmek için ihtiyacım olan düğüm adını biliyorum.Java'da XML dosyalarında bir değeri değiştirmenin en iyi yolu nedir?

Nodename ipAddress'dir.

JDOM'i kullanabilir, belge alabilir, düğüm alabilir, değeri değiştirebilir ve yazabilir veya bir XSLT dosyası yazabilirim.

Kod değiştirme değeri Java'dan geliyor, bu yüzden sorum bu seçenek daha mı iyi? XML dosyasının boyutu farklı olabilir.

Başka bir XSLT ile ilgili soru: XML'de bulunan tüm düğümleri listelemeyeceğim, ancak if node == ipAddress gibi belirtilecek, daha sonra yeni değeri alacağım bir XSLT dosyası yazmak mümkün mü ve nasıl uygularım? Java'dan XSLT dönüşümü?

Teşekkür ederiz.

+1

İyi soru 1. Tam bir XSLT çözümü için cevabımı ve en iyi Java tabanlı XSLT işlemcisinin belgelerine bir bağlantıyı görün. –

+0

"En iyi" ile ne demek istiyorsun? En uygun (en basit), en yüksek performans, büyük dosyalar için kullanılabilir mi? XSLT ve ağaç modelleri (DOM) uygun olabilir, ancak aynı zamanda çok sayıda bellek kullanır ve nispeten yavaştır (örneğin). – StaxMan

+0

Sakson, hemen hemen en iyisidir. DOM'den küçük bir bellek modeline sahiptir, büyük dosyalar için akışı destekler, olağanüstü bir iyileştiriciye sahiptir ve XSLT 1, XSLT 2, XQuery, XML Schema'yı destekler ve bazı yeni taslak standartlar için desteğe sahiptir. – lavinio

cevap

6

DOM almak için standart org.w3c.dom API'lerini kullanabilirsiniz. Ardından, standart javax.xml.xpath API'lerini kullanarak düğümü alın. Ve sonra geri yazmak için javax.xml.transform API'lerini kullanın. gibi

şey:

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

XSLT çözüm:

bu dönüşümün herhangi bir belge üzerinde uygulanır
<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> 

, belgenin tüm düğümler haricinde "olduğu gibi" kopyalanır ipAddress öğesinin öğesinin text-node alt öğesi (bu öğenin belgede nerede olduğuna bakılmaksızın). İkincisi, $pNewIpAddress olarak adlandırılan harici olarak sağlanan bir parametrenin değeriyle değiştirilir.

Örneğin, dönüşüm bu XML belgesinin karşı uygulanırsa:

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

aranan, doğru sonuç üretilir:

vardır
<t> 
    <a> 
     <b> 
     <ipAddress>192.68.0.1</ipAddress> 
     </b> 
     <c/> 
    </a> 
    <d/> 
</t> 

birçok Java tabanlı XSLT'den İşlemciler ve Java'dan nasıl çağrılabileceğini anlayabilecekleri yer onların belgeleridir. En iyi XSLT işlemcilerin biri Sakson ve onun belgeler bulunabilir:

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

+0

Cevabınız için çok teşekkür ederim. Yeni ip adresinin değerini transformer.transform (xml, xslt, variable) gibi java kodundan geçirip değiştiremeyeceğimi biliyor muyum, bu yüzden değer dinamik olarak hesaplandığından dolayı xslt dosyasında belirtmeyeceğim. – yart

+0

@yart: Evet. Burada Sakson belgelerine bakın: http://www.saxonica.com/documentation/using-xsl/embedding.xml –

İlgili konular