आप StAX
का उपयोग कर सकते हैं। StAX
SAX
जैसे पार्सर स्ट्रीम, लेकिन एक कर्सर बनाए रखता है और आपको 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
यह वास्तव में एक _incremental_ पार्सर नहीं है, लेकिन एक साधारण घटना पर ही आधारित पार्सर। मुझे वास्तव में आवश्यकता है कि नियंत्रण के उलटा बिना (पाठक कॉलबैक प्रदान करने के बिना एक्सएमएल के हिस्सों को खिलाने की संभावना है। उदा। 'Parser.feed (" "); do_something_other(); parser.feed (" ") ' –
minhee