Xml पार्स करते समय groovy में lookahead?

मैं एक एक्सएमएल-पेड़ को पार्स करने की कोशिश कर रहा हूं। में चाहता हूं:

  • Print a representation of the path to each item. Is there a smarter way to create the path?
  • Print the name and value of nodes with primaryType="content" (content-nodes)
  • Found a smarter/better approach. Filters? Smarter closures?
    • Can I do it another way to lookahead
  • This example is a simple example of a more complex real-world case I have. Searching for property-elements with primaryType="text"

नीचे दिए गए कोड को चलाने पर मुझे मिलता है:

root/
--folder1/
----folder2/
metadataitem: <- "Wrong" = not what I want
found value: findme

पर मुझे चहिये:

root/
--folder1/
----folder2/
------item: <- Without "metadata"  
found value: findme
  • It would be easy to do a stringreplace on "metadata" -> "" but that no good solution.
  • I would also like a smarter solution if you have time.

अग्रिम में धन्यवाद!

उदाहरण:

def example = '''

    
        folder
    
    
        
            metadata
        
        
            ...
        
    
    
        
            folder
        
        
            
                metadata
            
            
                ...
            
        
        
            
                folder
            
            
                ...
            
            
                
                    metadata
                
                
                    ...
                
            
            
                
                    content
                
                
                    findme
                
                
                    ...
                
            
        
    

'''

def xml = new XmlSlurper().parseText(example);

def listContent(node,pad) {
    node.node.property.find { [email protected] == "primaryType" && it.text() == "content" }.each { 
        it.parent().property.each { property ->
            if([email protected] == "text") {
                println "" + property.parent()[email protected] + ":"// Want: "item". Gets: "metadataitem" due to parent()
                println "found value: " + property.text()
            }
        }
    }
}

def listFolders(node,pad) {
    node.property.find { it.text() == "folder" }.each { property ->
        println "-".multiply(pad) + property.parent()[email protected] + "/"
        listContent(property.parent(),pad) 
    }
    node.children().each { child ->
        listFolders(child, pad+2)
    }
}
listFolders(xml,0)
0

1 उत्तर

आपके द्वारा प्रदान किया गया कोड (यहां थोड़ा tweaked)

def listContent( node, pad = 0 ) {
    node.node.property.find { [email protected] == "primaryType" && it.text() == "content" }.each { 
        it.parent().property.each { property ->
            if([email protected] == "text") {
                println  "${'-'*pad}${property.parent()[email protected]}:"
                println "found value: " + property.text()
            }
        }
    }
}

def listFolders( node, pad = 0 ) {
    node.property.find { it.text() == "folder" }.each { property ->
        println "${'-'*pad}${property.parent()[email protected]}/"
        listContent(property.parent(),pad + 2) 
    }
    node.children().each { child ->
        listFolders(child, pad+2)
    }
}
listFolders( xml )

ऐसा लगता है जो आप चाहते हैं, और प्रिंट करता है

root/
--folder1/
----folder2/
------item:
found value: findme

मैं नहीं देख सकता कि सवाल में आवश्यकता से अलग कैसे है?

0
जोड़ा
इनपुट के लिए धन्यवाद। मुझे पहले डिफ़ॉल्ट मानों के बारे में पता था - अच्छा। दुर्भाग्यवश, मुझे एक ही परिणाम नहीं मिला (मेरा और न ही आपके संस्करण के लिए)। मुझे मिलता है: ... ------ metadataitem: ... नहीं ------ आइटम: मुझे यकीन है कि यह एक ओएस है बग (चूंकि आप कहते हैं कि आपको "मेटाडाटाइटम" के बजाय "आइटम" मिलता है जैसा कि मुझे मिल रहा है)। मैं ग्रोवी संस्करण का उपयोग कर रहा हूं: 2.1.0 जेवीएम: 1.7.0_17 विक्रेता: ओरेकल कॉर्पोरेशन ओएस: मैक ओएस एक्स
जोड़ा लेखक Calle, स्रोत
अगर मैं इसे इस तरह कहता हूं: एक्सएमएल फाइलों की पेड़-संरचना का प्रतिनिधित्व करता है, जहां फाइल प्राथमिक टाइप प्रकार के साथ सभी नोड-ऑब्जेक्ट्स हैं। अब मैं एक्सएमएल द्वारा परिभाषित फ़ोल्डर-संरचना के अनुसार वास्तविक फ़ाइलों के रूप में सामग्री/वस्तुओं को क्रमबद्ध करने में सक्षम मधुमक्खियों के लिए संपूर्ण एक्सएमएल-संरचना को पार करना चाहता हूं। इससे मुझे अन्य लाभ भी मिलते हैं (उपयोग-मामले हैं जहां मैं केवल एक विशेष आइटम को उदाहरण के लिए एक विशिष्ट फ़ोल्डर-पथ दिया जाना चाहता हूं, या "मुझे नामित आइटम के लिए पथ दें")।
जोड़ा लेखक Calle, स्रोत