如何在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 

您可以在startElementendElement获取元素的名称 。 您还可以在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); } } }