2011-01-12 11 views
12

मेरे पास एक एक्सएमएल फ़ाइल है और मुझे नोड नाम पता है जिसके लिए मुझे मूल्य बदलने की जरूरत है।जावा में एक्सएमएल फाइलों में एक मान बदलने का सबसे अच्छा तरीका क्या है?

नोडनाम आईपी एड्रेस है।

मैं जेडीओएम का उपयोग कर सकता हूं, दस्तावेज़ प्राप्त कर सकता हूं, नोड प्राप्त कर सकता हूं और मूल्य बदल सकता हूं और इसे लिख सकता हूं या मैं एक एक्सएसएलटी फ़ाइल लिख सकता हूं।

कोड बदलने का मूल्य जावा से जाता है, इसलिए मेरा प्रश्न यह है कि कौन सा विकल्प बेहतर है? एक्सएमएल फ़ाइल का आकार अलग हो सकता है।

एक और एक्सएसएलटी से संबंधित प्रश्न: क्या एक्सएसएलटी फ़ाइल लिखना संभव है जैसे कि मैं एक्सएमएल में मौजूद सभी नोड्स सूचीबद्ध नहीं करूँगा, लेकिन बस if node == ipAddress जैसे निर्दिष्ट होगा, फिर नया मान लें, और मैं कैसे आवेदन करूं जावा से एक्सएसएलटी रूपांतरण?

धन्यवाद।

+1

अच्छा सवाल है, +1। एक पूर्ण एक्सएसएलटी समाधान के लिए मेरा उत्तर और सर्वश्रेष्ठ जावा-आधारित XSLT प्रोसेसर में से किसी एक के दस्तावेज़ के लिए एक लिंक देखें। –

+0

"सर्वश्रेष्ठ" से आपका क्या मतलब है? सबसे सुविधाजनक (सरलतम), अधिकतर प्रदर्शन, बड़ी फ़ाइलों के लिए उपयोग योग्य? एक्सएसएलटी और पेड़ मॉडल (डीओएम) सुविधाजनक हो सकते हैं, लेकिन बहुत सारी मेमोरी का उपयोग भी कर सकते हैं और अपेक्षाकृत धीमी हैं (उदाहरण के लिए)। – StaxMan

+0

सैक्सन काफी अच्छा है। इसमें एक छोटा-से-डीओएम इन-मेमोरी मॉडल है, यह बड़ी फ़ाइलों के लिए स्ट्रीमिंग का समर्थन करता है, इसमें असाधारण अनुकूलक है, और एक्सएसएलटी 1, एक्सएसएलटी 2, एक्सक्वियर, एक्सएमएल स्कीमा का समर्थन करता है, और इसमें कुछ नए मसौदे मानकों के लिए समर्थन है। – lavinio

उत्तर

6

आप डोम प्राप्त करने के लिए मानक org.w3c.dom एपीआई का उपयोग कर सकते हैं। फिर मानक javax.xml.xpath एपीआई का उपयोग कर नोड प्राप्त करें। और उसके बाद javax.xml.transform एपीआई का उपयोग इसे वापस लिखने के लिए करें।

कुछ की तरह:

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 समाधान:

<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> 

जब इस बदलाव किसी भी दस्तावेज़ पर लागू किया जाता है, दस्तावेज़ के सभी नोड्स कॉपी कर रहे हैं के अलावा "के रूप में-है" किसी भी ipAddress तत्व के टेक्स्ट-नोड बच्चे (भले ही यह तत्व दस्तावेज़ में है)। बाद में $pNewIpAddress नामक बाहरी रूप से प्रदान किए गए पैरामीटर के मान के साथ प्रतिस्थापित किया गया है।

उदाहरण के लिए, परिवर्तन इस XML दस्तावेज़ के खिलाफ लागू किया जाता है, तो:

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

चाहता था, सही परिणाम उत्पादन किया जाता है:

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

रहे हैं कई जावा आधारित XSLT प्रोसेसर और यह समझने के लिए उचित जगह है कि उन्हें जावा से कैसे बुलाया जा सकता है, उनका दस्तावेज है। सबसे अच्छा जैसे XSLT प्रोसेसर में से एक सेक्सन है और इसके प्रलेखन में पाया जा सकता:

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

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। क्या आप जानते हैं कि क्या मैं जावा कोड से ट्रांसफॉर्मर.ट्रांसफॉर्म (xml, xslt, variable) से वैरिएबल के माध्यम से नए आईपी पते का मान पास कर सकता हूं, इसलिए मैं इसे xslt फ़ाइल में सीधे निर्दिष्ट नहीं करूँगा क्योंकि मान गतिशील रूप से गणना की जाती है? – yart

+0

@yart: हाँ। सैक्सन दस्तावेज यहां देखें: http://www.saxonica.com/documentation/using-xsl/embedding.xml –

संबंधित मुद्दे

 संबंधित मुद्दे