2013-10-16 8 views
10

पायथन मानक लाइब्रेरी xml.sax.xmlreader.IncrementalParser इंटरफ़ेस प्रदान करता है जिसमें feed() विधि है। Jython भी xml.sax पैकेज प्रदान करता है जो हुड के तहत जावा SAX पार्सर कार्यान्वयन का उपयोग करता है, लेकिन ऐसा लगता है कि IncrementalParser प्रदान नहीं करता है।जैक्सन में SAX वृद्धिशील पार्सर

क्या कोई जेथॉन में एक्सएमएल के हिस्सों को बढ़ाने के लिए तरीका है? पहली नज़र में मैंने सोचा कि इसे greenlet जैसे कोरआउटिन का उपयोग करके हासिल किया जा सकता है, लेकिन मुझे तुरंत एहसास हुआ कि इसका उपयोग ज्योथन में नहीं किया जा सकता है।

उत्तर

3

आप StAX का उपयोग कर सकते हैं। StAXSAX जैसे पार्सर स्ट्रीम, लेकिन एक कर्सर बनाए रखता है और आपको hasNext() और next() का उपयोग करके कर्सर पर सामग्री निकालने की अनुमति देता है।

निम्नलिखित कोड इस जावा उदाहरण से अनुकूलित किया गया है। ध्यान दें कि यह मेरा पहला प्रयास है जो ज्योथन के साथ है, इसलिए अगर मैंने कुछ अपरंपरागत रूप से किया तो मुझे लटकाएं, लेकिन उदाहरण काम करता है।

http://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax-parser-in-java.html

from javax.xml.stream import XMLStreamConstants, XMLInputFactory, XMLStreamReader 
from java.io import ByteArrayInputStream; 
from java.lang import String 

xml = String(
"""<?xml version="1.0" encoding="ISO-8859-1"?> 
<employees> 
    <employee id="111"> 
    <firstName>Rakesh</firstName> 
    <lastName>Mishra</lastName> 
    <location>Bangalore</location> 
    </employee> 
    <employee id="112"> 
    <firstName>John</firstName> 
    <lastName>Davis</lastName> 
    <location>Chennai</location> 
    </employee> 
    <employee id="113"> 
    <firstName>Rajesh</firstName> 
    <lastName>Sharma</lastName> 
    <location>Pune</location> 
    </employee> 
</employees> 
""") 

class Employee: 
    id = None 
    firstName = None 
    lastName = None 
    location = None 

    def __str__(self): 
     return self.firstName + " " + self.lastName + "(" + self.id + ") " + self.location 

factory = XMLInputFactory.newInstance(); 
reader = factory.createXMLStreamReader(ByteArrayInputStream(xml.getBytes())) 
employees = [] 
employee = None 
tagContent = None 

while reader.hasNext(): 
    event = reader.next(); 

    if event == XMLStreamConstants.START_ELEMENT: 
     if "employee" == reader.getLocalName(): 
      employee = Employee() 
      employee.id = reader.getAttributeValue(0) 
    elif event == XMLStreamConstants.CHARACTERS: 
     tagContent = reader.getText() 
    elif event == XMLStreamConstants.END_ELEMENT: 
     if "employee" == reader.getLocalName(): 
      employees.append(employee) 
     elif "firstName" == reader.getLocalName(): 
      employee.firstName = tagContent 
     elif "lastName" == reader.getLocalName(): 
      employee.lastName = tagContent 
     elif "location" == reader.getLocalName(): 
      employee.location = tagContent 

for employee in employees: 
    print employee 
1

आप सीधे जावा के sax पार्सर का उपयोग कर सकते हैं।

from javax.xml.parsers import SAXParserFactory 
factory = SAXParserFactory.newInstance() 
xmlReader = XMLReaderFactory.createXMLReader() 

from org.xml.sax.helpers import DefaultHandler 
handler = DefaultHandler() # or use your own handler 
xmlReader.setContentHandler(handler) 
xmlReader.parse(new InputSource(streamReader)) 
+0

यह वास्तव में एक _incremental_ पार्सर नहीं है, लेकिन एक साधारण घटना पर ही आधारित पार्सर। मुझे वास्तव में आवश्यकता है कि नियंत्रण के उलटा बिना (पाठक कॉलबैक प्रदान करने के बिना एक्सएमएल के हिस्सों को खिलाने की संभावना है। उदा। 'Parser.feed (" "); do_something_other(); parser.feed ("") ' – minhee

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