如何在startElement中使用SAX解析器从XML获取元素的值?
是否可以从startElement
函数中的XML文件中获取元素的内容,该函数是SAX处理程序的覆盖函数?
以下是规格。
1)XML文件
Rakesh Mishra Bangalore John Davis Chennai Rajesh Sharma Pune
2) startElement
函数
@Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { .......code in here.......... }
3)预期结果
element name : employee attribute name : id attribute value: 111 firstName : Rakesh lastName : Mishra location : Bangalore element name : employee attribute name : id attribute value: 112 firstName : John lastName : Davis location : Chennai element name : employee attribute name : id attribute value: 113 firstName : Rajesh lastName : Sharma location : Pune
您可以在startElement
和endElement
获取元素的名称 。 您还可以在startElement
获取属性。 您应该以characters
获得的值。
以下是如何使用ContentHandler
获取元素值的一个非常基本的示例 :
public class YourHandler extends DefaultHandler { boolean inFirstNameElement = false; public class startElement(....) { if(qName.equals("firstName") { inFirstNameElement = true; } } public class endElement(....) { if(qName.equals("firstName") { inFirstNameElement = false; } } public class characters(....) { if(inFirstNameElement) { // do something with the characters in the element } } }
如果您有一个简单的示例,则为每个标记设置布尔标记即可。 如果你有一个更复杂的场景,你可能更喜欢使用元素名称作为键将标志存储在映射中,或者甚至创建一个或多个映射到XML的Employee
类,每次在startElement
找到
时实例化它们,填充它属性,并将其添加到endElement
的Collection。
这是一个完整的ContentHandler
示例,适用于您的示例文件。 我希望它可以帮助你开始:
public class SimpleHandler extends DefaultHandler { class Employee { public String firstName; public String lastName; public String location; public Map attributes = new HashMap<>(); } boolean isFirstName, isLastName, isLocation; Employee currentEmployee; List employees = new ArrayList<>(); @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if(qName.equals("employee")) { currentEmployee = new Employee(); for(int i = 0; i < atts.getLength(); i++) { currentEmployee.attributes.put(atts.getQName(i),atts.getValue(i)); } } if(qName.equals("firstName")) { isFirstName = true; } if(qName.equals("lastName")) { isLastName = true; } if(qName.equals("location")) { isLocation = true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("employee")) { employees.add(currentEmployee); currentEmployee = null; } if(qName.equals("firstName")) { isFirstName = false; } if(qName.equals("lastName")) { isLastName = false; } if(qName.equals("location")) { isLocation = false; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if (isFirstName) { currentEmployee.firstName = new String(ch, start, length); } if (isLastName) { currentEmployee.lastName = new String(ch, start, length); } if (isLocation) { currentEmployee.location = new String(ch, start, length); } } @Override public void endDocument() throws SAXException { for(Employee e: employees) { System.out.println("Employee ID: " + e.attributes.get("id")); System.out.println(" First Name: " + e.firstName); System.out.println(" Last Name: " + e.lastName); System.out.println(" Location: " + e.location); } } }