2009-06-23 14 views
7

में सभी एक्सएमएल नोड पीढ़ियों को Iterate मैं यह देखने के लिए जांचना चाहता हूं कि एक XML दस्तावेज़ में कहीं भी 'व्यक्ति' तत्व है या नहीं। मैं सभी पहली पीढ़ी के तत्वों की जांच कर सकते बहुत बस:जावा डीओएम

NodeList nodeList = root.getChildNodes(); 
for(int i=0; i<nodeList.getLength(); i++){ 
    Node childNode = nodeList.item(i); 
    if (childNode.getNodeName() == "person") { 
    //do something with it 
    } 
} 

और और मैं उसके उप-तत्व में जाने के लिए और अधिक छोरों में जोड़ सकते हैं, लेकिन मुझे पता है कि कितने नेस्टेड छोरों में में कितनी दूर डाल करने के लिए यह निर्धारित करने के लिए होता है ड्रिल करने के लिए दस्तावेज़। मैं 10 लूप घोंसला कर सकता था, और किसी दिए गए दस्तावेज़ में गहरे 12 तत्वों को निहित व्यक्ति तत्व के साथ समाप्त कर सकता था। मुझे इस तत्व को खींचने में सक्षम होना चाहिए कि इससे कोई फर्क नहीं पड़ता कि यह कितना गहराई से घिरा हुआ है।

क्या पूरे दस्तावेज़ से तत्वों को फसल करने का कोई तरीका है? सभी टैग्स के पाठ मानों को सरणी के रूप में वापस करने या इसके ऊपर पुनरावृत्ति की तरह?

कुछ अजगर के ElementTree 'findall' विधि शायद के लिए समान:

for person in tree.findall('//person'): 
    personlist.append(person) 
+1

मुझे तुम्हारी जरूरत है लगता है http://en.wikipedia.org/wiki/Recursion_%28computer_science % 29। –

उत्तर

10

mmyers में कहा गया है के रूप में, आप इस समस्या के लिए प्रत्यावर्तन इस्तेमाल कर सकते हैं।

doSomethingWithAll(root.getChildNodes()); 

void doSomethingWithAll(NodeList nodeList) 
{ 
    for (int i = 0; i < nodeList.getLength(); i++) { 
     Node childNode = nodeList.item(i); 
     if (childNode.getNodeName().equals("person")) { 
      //do something with it 
     } 

     NodeList children = childNode.getChildNodes(); 
     if (children != null) 
     { 
      doSomethingWithAll(children); 
     } 
    } 
} 
4

XPath यही है।

//person 

यह सीधे JDK के XPath API का उपयोग करने दर्द हो सकता है: "व्यक्ति" नाम सभी तत्वों को प्राप्त करने के लिए, यहाँ अभिव्यक्ति है। मैं रैपर है कि मैं व्यावहारिक एक्सएमएल पुस्तकालय में लिखा पसंद करते हैं: http://practicalxml.sourceforge.net/

और यहाँ एक ट्यूटोरियल है कि मैंने लिखा है (सामान्य रूप में JDK XPath पर है, लेकिन XPathWrapper का उल्लेख है): http://www.kdgregory.com/index.php?page=xml.xpath

10

मैं तीन possiblities (जिनमें से दो को देखने के अन्य ने उत्तर दिया है):

  1. रिकर्सन का उपयोग करें।
  2. XPath का उपयोग करें (इस समस्या के लिए थोड़ा अधिक 0kहो सकता है, लेकिन यदि आपके पास इस तरह के कई प्रश्न हैं तो यह निश्चित रूप से कुछ अन्वेषण करने के लिए है)। उस पर kdgregory की मदद का उपयोग करें; एपीआई पर त्वरित रूप से संकेत मिलता है कि यह का उपयोग करने के लिए थोड़ा दर्दनाक है।
  3. तो तुम्हारे पास क्या है वास्तव में एक Document (अर्थात root है अगर एक Document), तो आपको Document.getElementsByTagName
+1

+1 - # 3 तीसरे दृष्टिकोण के लिए निश्चित रूप से सबसे आसान तरीका – kdgregory

+0

+1 है – NemoStein

0
Document.getElementsByTagName() से

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

// Just looking for tag names 
for (Element person : $(tree).find("person")) { 
    personlist.append(person); 
} 

// Use XPath for more elaborate queries 
for (Element person : $(tree).xpath("//person")) { 
    personlist.append(person); 
} 
2

यहाँ स्वरूपित संस्करण है:

Element root = xmlData.getDocumentElement(); 
NodeList children = root.getChildNodes(); 

public void doSomethingWithAllToConsole(NodeList nodeList, String tabs) 
{ 
    for(int i=0; i<nodeList.getLength(); i++){ 

     //print current node & values 
     Node childNode = nodeList.item(i); 
     if(childNode.getNodeType()==Node.ELEMENT_NODE){ 
      System.out.print(tabs + childNode.getNodeName()); 
      if(childNode.getFirstChild()!=null 
        && childNode.getFirstChild().getNodeType()==Node.TEXT_NODE 
        && !StringUtil.isNullOrEmpty(childNode.getFirstChild().getNodeValue())){ 
       System.out.print(" = " + childNode.getFirstChild().getNodeValue()); 
      } 
      System.out.println(); 
     } 

     //recursively iterate through child nodes 
     NodeList children = childNode.getChildNodes(); 
     if (children != null) 
     { 
      doSomethingWithAllToConsole(children, tabs+"\t"); 
     } 
    } 
} 
संबंधित मुद्दे