2009-03-10 7 views
7

अगर मैं की तरहमैं एक्सएमएल से बाल तत्व को जावा में स्ट्रिंग में कैसे निकालूं?

<root> 
    <element1> 
     <child attr1="blah"> 
      <child2>blahblah</child2> 
     <child> 
    </element1> 
</root> 

एक XML दस्तावेज मैं पहले बच्चे तत्व के साथ एक XML स्ट्रिंग प्राप्त करना चाहते है। मेरी आउटपुट स्ट्रिंग

<element1> 
    <child attr1="blah"> 
     <child2>blahblah</child2> 
    <child> 
</element1> 

कई दृष्टिकोण हैं, कुछ विचार देखना चाहते हैं। मैं इसके लिए जावा एक्सएमएल एपीआई का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह स्पष्ट नहीं है कि ऐसा करने का एक अच्छा तरीका है।

धन्यवाद

उत्तर

7

आप सही हैं, मानक XML API के साथ, वहाँ एक अच्छा तरीका नहीं है - यहाँ एक उदाहरण दिया गया है (बग ग्रस्त हो सकता है, यह चलता है, लेकिन मैं इसे एक लंबे समय पहले लिखा था)।

import javax.xml.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.*; 
import javax.xml.transform.stream.*; 
import org.w3c.dom.*; 
import java.io.*; 

public class Proc 
{ 
    public static void main(String[] args) throws Exception 
    { 
     //Parse the input document 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new File("in.xml")); 

     //Set up the transformer to write the output string 
     TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(); 
     transformer.setOutputProperty("indent", "yes"); 
     StringWriter sw = new StringWriter(); 
     StreamResult result = new StreamResult(sw); 

     //Find the first child node - this could be done with xpath as well 
     NodeList nl = doc.getDocumentElement().getChildNodes(); 
     DOMSource source = null; 
     for(int x = 0;x < nl.getLength();x++) 
     { 
      Node e = nl.item(x); 
      if(e instanceof Element) 
      { 
       source = new DOMSource(e); 
       break; 
      } 
     } 

     //Do the transformation and output 
     transformer.transform(source, result); 
     System.out.println(sw.toString()); 
    } 
} 

यह प्रतीत होता है तुम सिर्फ doc.getDocumentElement() का उपयोग करके पहला बच्चा हो सकता है की तरह। GetFirstChild(), लेकिन उस के साथ समस्या यह है अगर वहाँ जड़ और बच्चे तत्व के बीच कोई खाली स्थान के है, कि पेड़ में एक पाठ नोड बनाएगा, और आपको वास्तविक तत्व नोड के बजाय उस नोड को प्राप्त होगा। इस कार्यक्रम से उत्पादन होता है:

D:\home\tmp\xml>java Proc 
<?xml version="1.0" encoding="UTF-8"?> 
<element1> 
     <child attr1="blah"> 
      <child2>blahblah</child2> 
     </child> 
    </element1> 

मुझे लगता है कि आप एक्सएमएल संस्करण स्ट्रिंग को दबाने सकते हैं यदि आप इसकी आवश्यकता नहीं है, लेकिन मैं उस पर यकीन नहीं है। यदि संभव हो तो मैं शायद किसी तृतीय पक्ष XML लाइब्रेरी का उपयोग करने का प्रयास करूंगा।

3

मैं JDOM की सिफारिश करेंगे। यह एक जावा एक्सएमएल लाइब्रेरी है जो मानक डब्ल्यू 3 सी दृष्टिकोण से एक्सएमएल के साथ काम करना आसान बनाती है।

0

यदि आपके एक्सएमएल में स्कीमा का बैकिंग है, तो आप xmlbeans या JAXB का उपयोग pojo ऑब्जेक्ट्स उत्पन्न करने के लिए कर सकते हैं जो आपको marshal/unmarshal xml की मदद करते हैं।

http://xmlbeans.apache.org/ https://jaxb.dev.java.net/

+0

नहीं, मैं dom4j साथ ऐसा करना चाहते हैं। कोई संकेत ... – user234194

1

XMLBeans पार्सिंग की परेशानियों से निपटने के बिना एक्सएमएल से निपटने के लिए उपयोग करने में आसान है (एक बार जब आप इसे लटकते हैं) टूल।

यह आवश्यक है कि आपके पास XML फ़ाइल के लिए एक स्कीमा है, लेकिन यह एक एक्सिसिंट एक्सएमएल फ़ाइल से स्कीमा उत्पन्न करने के लिए एक टूल भी प्रदान करता है (जेनरेट की आपकी ज़रूरतों के आधार पर शायद ठीक है)।

5

के बाद से इस शीर्ष गूगल जवाब है और आप में से जो लोग सिर्फ बुनियादी चाहते हैं के लिए:

public static String serializeXml(Element element) throws Exception 
{ 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    StreamResult result = new StreamResult(buffer); 

    DOMSource source = new DOMSource(element); 
    TransformerFactory.newInstance().newTransformer().transform(source, result); 

    return new String(buffer.toByteArray()); 
} 

मैं डिबग है, जो सबसे अधिक संभावना है क्या आप के लिए

+0

क्या आप ट्रांसफॉर्मर को ? – jophde

0

प्रश्न के रूप में इस की जरूरत है के लिए इसका उपयोग अन्य स्ट्रिंग के अंदर स्ट्रिंग की पहली घटना के बारे में वास्तव में है, मैं स्ट्रिंग वर्ग के तरीकों का प्रयोग करेंगे, एक्सएमएल पारसर्स के बजाय:

public static String getElementAsString(String xml, String tagName){ 
    int beginIndex = xml.indexOf("<" + tagName); 
    int endIndex = xml.indexOf("</" + tagName, beginIndex) + tagName.length() + 3; 
    return xml.substring(beginIndex, endIndex); 
} 
0
public String getXML(String xmlContent, String tagName){ 

    String startTag = "<"+ tagName + ">"; 
    String endTag = "</"+ tagName + ">"; 
    int startposition = xmlContent.indexOf(startTag); 
    int endposition = xmlContent.indexOf(endTag, startposition); 
    if (startposition == -1){ 
     return "ddd"; 
    } 
    startposition += startTag.length(); 
    if(endposition == -1){ 
     return "eee"; 
    } 
    return xmlContent.substring(startposition, endposition); 
} 

इस विधि में स्ट्रिंग के रूप में अपनी एक्सएमएल पास करें, और आपके मामले में पैरामीटर टैगनाम के रूप में 'तत्व' पास करें।

0

आप उचित xpath एक्सप्रेशन पास करके स्ट्रिंग के रूप में एक्सएमएल ब्लॉक को निकालने के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं,

private static String nodeToString(Node node) throws TransformerException 
{ 
    StringWriter buf = new StringWriter(); 
    Transformer xform = TransformerFactory.newInstance().newTransformer(); 
    xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    xform.transform(new DOMSource(node), new StreamResult(buf)); 
    return(buf.toString()); 
} 

    public static void main(String[] args) throws Exception 
{ 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(inputFile); 

     XPath xPath = XPathFactory.newInstance().newXPath(); 
     Node result = (Node)xPath.evaluate("A/B/C", doc, XPathConstants.NODE); //"A/B[id = '1']" //"//*[@type='t1']" 

     System.out.println(nodeToString(result)); 

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