2010-09-15 17 views
11

का उपयोग कर एक्सएमएल नोड को हटाएं नीचे दिए गए नमूना एक्सएमएल में, जावा पार्सर का उपयोग करते हुए ई = 13 अगर संपूर्ण बी नोड को कैसे हटाएं।जावा पार्सर

<xml> 
    <A> 
    <B> 
     <C> 
     <E>11</E> 
     <F>12</F> 
     </C> 
    </B> 
    <B> 
     <C> 
     <E>13</E> 
     <F>14</F> 
     </C> 
    </B> 
    </A> 

कृपया सलाह दें।

+0

@ user274069: XPath एक एक्सएमएल पेड़ के नोड्स का चयन करने के लिए एक होस्टेड भाषा है। यह पेड़ को बदल नहीं करता है। यदि आप एक्सएसएलटी समाधान चाहते हैं, तो कृपया पुनः प्रयास करें। –

उत्तर

14

वैकल्पिक डोम दृष्टिकोण

वैकल्पिक रूप से, बजाय आप JDK में XPath क्षमताओं इस्तेमाल कर सकते हैं "बी को खोजने के लिए XML दस्तावेज के जानवर बल ट्रेवर्सल करने का 13 "और फिर" के साथ मूल्य तत्व "अपनी मूल से हटाने:

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)); 
    } 

} 

एक XPath यह आसान है बनाए रखने के लिए, यदि संरचना बदल जाती है यह आपके कोड के लिए सिर्फ एक एक पंक्ति परिवर्तन है उपयोग करने का लाभ। इसके अलावा यदि आपके दस्तावेज़ की गहराई बढ़ती है तो XPath आधारित समाधान लाइनों की एक ही संख्या में रहता है।

गैर डोम दृष्टिकोण

आप एक डोम के रूप में अपने एक्सएमएल अमल में लाना करने के लिए नहीं करना चाहते हैं। आप एक नोड को हटाने के लिए एक ट्रांसफार्मर और एक स्टाइलशीट इस्तेमाल कर सकते हैं:

+0

यह भी अच्छा काम करता है। धन्यवाद – user274069

+0

ग्रेट यह काम करता है। बहुत धन्यवाद। मैं स्ट्रिंग में टेक्स्ट कैसे प्राप्त कर सकता हूं ?? – alibenmessaoud

+0

@alibm - जांचें: http://stackoverflow.com/questions/5711077/java-xml-parsing/5716573#5716573 –

2

यदि आप डोम का उपयोग कर रहे हैं तो यह आसान है। बस दस्तावेज़ को पार करें और बी नोड्स का ट्रैक रखें। जब आप ई = 13 नोड हिट करते हैं, तो बी नोड को हटा दें। यहाँ कुछ कोड मदद करने के लिए है:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
Document doc = factory.newDocumentBuilder().parse(new File("file.xml")); 
DocumentTraversal traversal = (DocumentTraversal) doc; 
Node a = doc.getDocumentElement(); 
NodeIterator iterator = traversal.createNodeIterator(a, NodeFilter.SHOW_ELEMENT, null, true); 
Element b = null; 
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { 
    Element e = (Element) n; 
    if ("B".equals(e.getTagName())) { 
     b = e; 
    } else if ("E".equals(e.getTagName()) && "13".equals(e.getTextContent()) && b != null) { 
     a.removeChild(b); 
    } 
} 
+0

ग्रेट यह वर्क। बहुत धन्यवाद। – user274069

+0

यह देखने के लिए मेरा उत्तर चेकआउट करें कि जावा एसई XPath एपीआई का उपयोग दस्तावेज़ ट्रावर्सल को खत्म करने के लिए कैसे किया जा सकता है - http://stackoverflow.com/questions/3717215/remove-xml-node-using-java-parser/3717875#3717875 –

0

मैं ब्लेज कोड के साथ फ़ाइल के इस उदाहरण की कोशिश की और मैं

Exception in thread "main" java.lang.NullPointerException 
    at myxml.xmlParty2.main(xmlParty2.java:22) 

इस फ़ाइल में है मिल

<?xml version="1.0" encoding="UTF-8"?> 
<favoris> 
    <workflow codewf="wf2333"> 
     <information> 
      <title>wf2333</title> 
      <desc>desc_title_5</desc> 
      <nberState>2</nberState> 
      <text>Impossible de joindre Cliquez sur le lien ci-dessous pour effectuer une nouvelle tentative.</text> 
     </information> 
     <states> 
      <state id="1" IDemployee="2">desc_wf_1_etat_1</state> 
      <state id="2" IDemployee="3">desc_wf_1_etat_2</state> 
     </states> 
    </workflow> 

    <workflow codewf="wf2334"> 
     <information> 
      <title>wf2334</title> 
      <desc>desc_title_5</desc> 
      <nberState>2</nberState> 
      <text>Impossible de joindre Cliquez sur le lien ci-dessous pour effectuer une nouvelle tentative.</text> 
     </information> 
     <states> 
      <state id="1" IDemployee="2">desc_wf_1_etat_1</state> 
      <state id="2" IDemployee="3">desc_wf_1_etat_2</state> 
     </states> 
    </workflow> 

</favoris> 

और Xptah क्वेरीहै

0

भविष्यवाणी के साथ XPath का उपयोग करके नोड बी को हटाने का कोड यहां दिया गया है। यह VTD-XML पर आधारित है, जो विशिष्ट रूप से वृद्धिशील अद्यतन लागू करता है।

import com.ximpleware.*; 
import java.io.*; 

public class removeNode { 
    public static void main(String s[]) throws VTDException, IOException{ 
     VTDGen vg = new VTDGen(); 
     if (!vg.parseFile("input.xml", false)); 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     XMLModifier xm = new XMLModifier(vn); 
     ap.selectXPath("/xml/A/B[C/E='13']"); 
     while (ap.evalXPath()!=-1){ 
      xm.remove(); 
     } 
     xm.output("output.xml"); 
    } 

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