2011-10-27 8 views
6

से नोड सामग्री कैसे प्राप्त करें मैं आयात org.jdom का उपयोग कर जावा में एक एप्लिकेशन लिख रहा हूं। *;जेडीओएम

मेरा एक्सएमएल मान्य है, लेकिन कभी-कभी इसमें HTML टैग होते हैं। उदाहरण के लिए, कुछ इस तरह:

<program-title>Anatomy &amp; Physiology</program-title> 
    <overview> 
     <content> 
       For more info click <a href="page.html">here</a> 
       <p>Learn more about the human body. Choose from a variety of Physiology (A&amp;P) designed for complementary therapies.&amp;#160; Online studies options are available.</p> 
     </content> 
    </overview> 
    <key-information> 
    <category>Health &amp; Human Services</category> 

तो मेरी समस्या < पी के साथ है> overview.content नोड के अंदर टैग।

मुझे उम्मीद थी कि इस कोड काम करेगा:

 Element overview = sds.getChild("overview"); 
     Element content = overview.getChild("content"); 

     System.out.println(content.getText()); 

लेकिन यह खाली देता है।

मैं ओवरव्यू.content नोड से सभी पाठ (नेस्टेड टैग और सभी) कैसे वापस कर सकता हूं?

धन्यवाद

+0

हाय, मैं कैसे सामग्री नोड बाहर समतल कर सकते हैं रिकर्सिवली, जब पाठ अन्य नोड के साथ मिश्रित किया जाता है। उदाहरण के लिए एक हाइपरलिंक वाक्य के बीच में बैठता है। मैंने कुछ मदद के लिए एक उपहार दिया है। –

+0

एक लिंक और आदेशित सूचियों सहित सामग्री टैग के अंदर सभी HTML प्राप्त करने की आवश्यकता है। धन्यवाद –

उत्तर

0

समस्या यह है कि <content> नोड एक पाठ बच्चा नहीं होता है; इसमें <p> बच्चा है जिसमें टेक्स्ट शामिल होता है।

Element overview = sds.getChild("overview"); 
Element content = overview.getChild("content"); 
Element p = content.getChild("p"); 
System.out.println(p.getText()); 

आप सभी तत्काल बच्चे नोड्स चाहते हैं, फोन p.getChildren():

इस प्रयास करें। यदि आप सभी बच्चे नोड्स प्राप्त करना चाहते हैं, तो आपको इसे बार-बार कॉल करना होगा।

+0

और फिर मैन्युअल रूप से एलिमेंट प्रकार नोड्स को पाठपरक प्रतिनिधित्व में बदल दें ... मेरे मन में शायद जो भी था उससे काफी सरल। –

4

आप निकटतम अनुमान के लिए method getValue() का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह क्या करता है तत्व और वंशजों के साथ सभी पाठों को एकसाथ जोड़ता है। यह आपको किसी भी रूप में <p> टैग नहीं देगा। यदि वह टैग आपके एक्सएमएल में है जैसा आपने दिखाया है, तो यह एक्सएमएल मार्कअप का हिस्सा बन गया है। इसे &lt;p&gt; के रूप में शामिल किया जाना चाहिए या पाठ के रूप में माना जाने वाला सीडीएटीए अनुभाग में एम्बेड किया जाना चाहिए।

वैकल्पिक रूप से, यदि आप अपने एक्सएमएल में या तो दिखाई देने वाले सभी तत्वों को जानते हैं, तो आप एक एक्सएसएलटी रूपांतरण लागू कर सकते हैं जो सामान को बदल देता है जो सादा पाठ में मार्कअप के रूप में नहीं है।

+0

उन लोगों के लिए बिल्कुल सही जवाब जिन्हें मिश्रित सामग्री में तत्व नामों की आवश्यकता नहीं है। धन्यवाद! –

16

content.getText() तत्काल पाठ देता है जो पाठ सामग्री वाले पत्ते तत्वों के साथ केवल उपयोगी है।

चाल का उपयोग करने के org.jdom.output.XMLOutputter

public static void main(String[] args) throws Exception { 
    SAXBuilder builder = new SAXBuilder(); 
    String xmlFileName = "a.xml"; 
    Document doc = builder.build(xmlFileName); 

    Element root = doc.getRootElement(); 
    Element overview = root.getChild("overview"); 
    Element content = overview.getChild("content"); 

    XMLOutputter outp = new XMLOutputter(); 

    outp.setFormat(Format.getCompactFormat()); 
    //outp.setFormat(Format.getRawFormat()); 
    //outp.setFormat(Format.getPrettyFormat()); 
    //outp.getFormat().setTextMode(Format.TextMode.PRESERVE); 

    StringWriter sw = new StringWriter(); 
    outp.output(content.getContent(), sw); 
    StringBuffer sb = sw.getBuffer(); 
    System.out.println(sb.toString()); 
} 

आउटपुट

For more info click<a href="page.html">here</a><p>Learn more about the human body. Choose from a variety of Physiology (A&amp;P) designed for complementary therapies.&amp;#160; Online studies options are available.</p> 

अन्य formatting विकल्पों का पता लगाने और अपनी जरूरत के लिए कोड ऊपर संशोधित करते हैं (पाठ मोड CompactFormat के साथ) है।

"क्लास XMLOutputter प्रारूप विकल्प संपुटित करने के लिए। ठेठ उपयोगकर्ताओं() getRawFormat द्वारा प्राप्त मानक प्रारूप विन्यास (कोई खाली स्थान के परिवर्तन), getPrettyFormat() (सफेद स्थान को सौंदर्यीकरण) का उपयोग कर सकते हैं और getCompactFormat() (सफेद स्थान को सामान्य)।"

+0

धन्यवाद आदमी !! –

3

ठीक है, हो सकता है कि तुम क्या जरूरत है:

import java.io.StringReader; 

import org.custommonkey.xmlunit.XMLTestCase; 
import org.custommonkey.xmlunit.XMLUnit; 
import org.jdom.input.SAXBuilder; 
import org.jdom.output.XMLOutputter; 
import org.testng.annotations.Test; 
import org.xml.sax.InputSource; 

public class HowToGetNodeContentsJDOM extends XMLTestCase 
{ 
    private static final String XML = "<root>\n" + 
      " <program-title>Anatomy &amp; Physiology</program-title>\n" + 
      " <overview>\n" + 
      "  <content>\n" + 
      "    For more info click <a href=\"page.html\">here</a>\n" + 
      "    <p>Learn more about the human body. Choose from a variety of Physiology (A&amp;P) designed for complementary therapies.&amp;#160; Online studies options are available.</p>\n" + 
      "  </content>\n" + 
      " </overview>\n" + 
      " <key-information>\n" + 
      "  <category>Health &amp; Human Services</category>\n" + 
      " </key-information>\n" + 
      "</root>"; 
    private static final String EXPECTED = "For more info click <a href=\"page.html\">here</a>\n" + 
      "<p>Learn more about the human body. Choose from a variety of Physiology (A&amp;P) designed for complementary therapies.&amp;#160; Online studies options are available.</p>"; 

    @Test 
    public void test() throws Exception 
    { 
     XMLUnit.setIgnoreWhitespace(true); 
     Document document = new SAXBuilder().build(new InputSource(new StringReader(XML))); 
     List<Content> content = document.getRootElement().getChild("overview").getChild("content").getContent(); 
     String out = new XMLOutputter().outputString(content); 
     assertXMLEqual("<root>" + EXPECTED + "</root>", "<root>" + out + "</root>"); 
    } 
} 

आउटपुट:

PASSED: test on instance null(HowToGetNodeContentsJDOM) 

=============================================== 
    Default test 
    Tests run: 1, Failures: 0, Skips: 0 
=============================================== 

मैं जेनरिक साथ JDom उपयोग कर रहा हूँ: http://www.junlu.com/list/25/883674.html

संपादित करें: असल में यह है कि काफी नहीं है प्रशांत भाट के जवाब से अलग। शायद आपको हमें यह बताना होगा कि आप क्या खो रहे हैं ...

0

विशेष रूप से सुंदर नहीं है, लेकिन ठीक काम करता है (का उपयोग कर JDOM एपीआई): हालांकि

public static String getRawText(Element element) { 
    if (element.getContent().size() == 0) { 
     return ""; 
    } 

    StringBuffer text = new StringBuffer(); 
    for (int i = 0; i < element.getContent().size(); i++) { 
     final Object obj = element.getContent().get(i); 
     if (obj instanceof Text) { 
      text.append(((Text) obj).getText()); 
     } else if (obj instanceof Element) { 
      Element e = (Element) obj; 
      text.append("<").append(e.getName()); 
      // dump all attributes 
      for (Attribute attribute : (List<Attribute>)e.getAttributes()) { 
       text.append(" ").append(attribute.getName()).append("=\"").append(attribute.getValue()).append("\""); 
      } 
      text.append(">"); 
      text.append(getRawText(e)).append("</").append(e.getName()).append(">"); 
     } 
    } 
    return text.toString(); 
} 

प्रशांत भाटे के समाधान अच्छे है!

1

यदि आप एक्सएमएल फाइल भी बना रहे हैं तो आपको <![CDATA[]]> में अपने एचटीएमएल डेटा को एन्सेप्लेट करने में सक्षम होना चाहिए ताकि इसे एक्सएमएल पार्सर द्वारा पार्स नहीं किया जा सके।

+0

नहीं, दुर्भाग्य से मैं एक्सएमएल उत्पन्न नहीं करता हूं, मुझे बस इसे उपभोग करना है। –

0

आप उत्पादन करना चाहते हैं कुछ JSOM नोड के सामग्री केवल का उपयोग

System.out.println(new XMLOutputter().outputString(node))