Java 编写包含多个元素的XML,这些元素又包含多个元素
这里我有一个包含多个学生和多个教师的XML文件:Java 编写包含多个元素的XML,这些元素又包含多个元素,java,xml,xsd,Java,Xml,Xsd,这里我有一个包含多个学生和多个教师的XML文件: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <users> <students> <student id="student1"> <name>Alan</name> <age>11</age> <dob>01/01/2001&l
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<students>
<student id="student1">
<name>Alan</name>
<age>11</age>
<dob>01/01/2001</dob>
<grade>A+</grade>
</student>
<student id="student2">
<name>Bob</name>
<age>22</age>
<dob>02/02/2002</dob>
<grade>A</grade>
</student>
</students>
<teachers>
<teacher id="teacher3">
<name>David</name>
<age>33</age>
<dob>03/03/2003</dob>
<subject>Maths</subject>
</teacher>
<teacher id="teacher4">
<name>Ellen</name>
<age>44</age>
<dob>04/04/2004</dob>
<subject>English</subject>
</teacher>
</teachers>
</users>
在它工作时,它会正确地保存数据。但由于我的问题,没有包括年级/科目
这是创建对象的类:
class Model extends DefaultHandler {
String fileName;
ArrayList<User> listOfUsers;
Student student;
Teacher teacher;
boolean blnStudent = false;
boolean blnTeacher = false;
boolean blnName = false;
boolean blnAge = false;
boolean blnDOB = false;
boolean blnGrade = false;
boolean blnSubject = false;
Model() {
fileName = "school.xml";
listOfUsers = new ArrayList<User>();
}
ArrayList<User> getListOfUsers() {
if (validateXML() == true) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(fileName), this);
} catch (Exception error) {
error.getMessage();
}
}
return listOfUsers;
}
boolean validateXML() {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema(new File("school.xsd"));
Validator validator = schema.newValidator();
Source source = new StreamSource(new File(fileName));
validator.validate(source);
return true;
} catch (Exception error) {
error.getMessage();
return false;
}
}
public void startElement(String uri, String localName, String tagName, Attributes attributes) throws SAXException {
if (tagName.equalsIgnoreCase("student")) {
student = new Student(attributes.getValue("id"));
blnStudent = true;
} else if (tagName.equalsIgnoreCase("teacher")) {
teacher = new Teacher(attributes.getValue("id"));
blnTeacher = true;
} else if (tagName.equalsIgnoreCase("name")) {
blnName = true;
} else if (tagName.equalsIgnoreCase("age")) {
blnAge = true;
} else if (tagName.equalsIgnoreCase("dob")) {
blnDOB = true;
} else if (tagName.equalsIgnoreCase("grade")) {
blnGrade = true;
} else if (tagName.equalsIgnoreCase("subject")) {
blnSubject = true;
}
}
public void endElement(String uri, String localName, String tagName) throws SAXException {
if (tagName.equalsIgnoreCase("student")) {
listOfUsers.add(student);
} else if (tagName.equalsIgnoreCase("teacher")) {
listOfUsers.add(teacher);
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (blnStudent) {
if (blnName) {
student.setName(new String(ch, start, length));
blnName = false;
} else if (blnAge) {
student.setAge(new String(ch, start, length));
blnAge = false;
} else if (blnDOB) {
student.setDOB(new String(ch, start, length));
blnDOB = false;
} else if (blnGrade) {
student.setGrade(new String(ch, start, length));
blnGrade = false;
blnStudent = false;
}
} else if (blnTeacher) {
if (blnName) {
teacher.setName(new String(ch, start, length));
blnName = false;
} else if (blnAge) {
teacher.setAge(new String(ch, start, length));
blnAge = false;
} else if (blnDOB) {
teacher.setDOB(new String(ch, start, length));
blnDOB = false;
} else if (blnSubject) {
teacher.setSubject(new String(ch, start, length));
blnSubject = false;
blnTeacher = false;
}
}
}
void updateXML(int index, String fields[]) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(fileName));
doc.getElementsByTagName("name") .item(index).setTextContent(fields[0]);
doc.getElementsByTagName("age") .item(index).setTextContent(fields[1]);
doc.getElementsByTagName("dob") .item(index).setTextContent(fields[2]);
// IF STUDENT
doc.getElementsByTagName("grade") .item(index).setTextContent(fields[3]);
// ELSE TEACHER
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(fileName));
transformer.transform(source, result);
} catch (Exception error) {
error.getMessage();
}
}
}
类模型扩展了DefaultHandler{
字符串文件名;
ArrayList用户列表;
学生;
教师;
布尔blnStudent=false;
布尔blnTeacher=false;
布尔blnName=false;
布尔blnAge=false;
布尔blnDOB=false;
布尔blnGrade=false;
布尔BLNSObject=false;
模型(){
fileName=“school.xml”;
listOfUsers=newArrayList();
}
ArrayList getListOfUsers(){
if(validateXML()==true){
试一试{
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(新文件(文件名),该文件名为;
}捕获(异常错误){
错误。getMessage();
}
}
返回用户列表;
}
布尔validateXML(){
试一试{
SchemaFactory工厂=SchemaFactory.newInstance(“http://www.w3.org/2001/XMLSchema");
Schema=factory.newSchema(新文件(“school.xsd”);
Validator Validator=schema.newValidator();
Source Source=新的StreamSource(新文件(文件名));
validator.validate(源代码);
返回true;
}捕获(异常错误){
错误。getMessage();
返回false;
}
}
public void startElement(字符串uri、字符串localName、字符串标记名、属性)引发SAXException{
if(标记名.equalsIgnoreCase(“学生”)){
学生=新学生(attributes.getValue(“id”);
blnStudent=true;
}else if(标记名.equalsIgnoreCase(“教师”)){
教师=新教师(attributes.getValue(“id”);
blnTeacher=true;
}else if(标记名.equalsIgnoreCase(“名称”)){
blnName=true;
}else if(标记名.equalsIgnoreCase(“年龄”)){
blnAge=true;
}else if(标记名.equalsIgnoreCase(“dob”)){
blnDOB=真;
}else if(标记名.equalsIgnoreCase(“等级”)){
blnGrade=正确;
}else if(标记名.equalsIgnoreCase(“主题”)){
blnsObject=true;
}
}
public void endElement(字符串uri、字符串localName、字符串标记名)引发SAXException{
if(标记名.equalsIgnoreCase(“学生”)){
用户列表。添加(学生);
}else if(标记名.equalsIgnoreCase(“教师”)){
添加(教师);
}
}
公共无效字符(char ch[],int start,int length)引发异常{
如果(B学生){
如果(blnName){
setName(新字符串(ch,start,length));
blnName=false;
}else if(blnAge){
设置(新字符串(ch,起始,长度));
blnAge=false;
}否则如果(blnDOB){
setDOB(新字符串(ch,start,length));
blnDOB=假;
}否则如果(blnGrade){
setGrade(新字符串(ch,start,length));
blnGrade=假;
blnStudent=false;
}
}else if(blnTeacher){
如果(blnName){
setName(新字符串(ch,start,length));
blnName=false;
}else if(blnAge){
设置(新字符串(ch,起始,长度));
blnAge=false;
}否则如果(blnDOB){
setDOB(新字符串(ch,start,length));
blnDOB=假;
}else if(blnsObject){
setSubject(新字符串(ch,start,length));
blnsObject=false;
blnTeacher=false;
}
}
}
void updateXML(int索引,字符串字段[]){
试一试{
DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder=docFactory.newDocumentBuilder();
Document doc=docBuilder.parse(新文件(文件名));
doc.getElementsByTagName(“名称”).item(索引).setTextContent(字段[0]);
doc.getElementsByTagName(“年龄”).item(索引).setTextContent(字段[1]);
doc.getElementsByTagName(“dob”).item(index.setTextContent(字段[2]);
//如果学生
doc.getElementsByTagName(“grade”).item(index.setTextContent(字段[3]);
//其他老师
TransformerFactory=TransformerFactory.newInstance();
变压器=工厂新变压器();
DOMSource=新的DOMSource(doc);
StreamResult=新的StreamResult(新文件名));
变换(源、结果);
}捕获(异常错误){
错误。getMessage();
}
}
}
问题在于,这些元素对用户本身并不重要;它们也只能通过创建它们的编号来调用。例如,当我设置用户名时:
doc.getElementsByTagName("name").item(0).setTextContent("Alan Zero");
我不是要求系统设置第一个用户名值
,而是要求系统设置第一个用户名值
。因此,只要每个用户创建的字段数量完全相同,这就不会成为问题,因为每个字段都会自动分配给各自的用户。例如:
- (0)艾伦·泽罗
- (1) 鲍勃一号
- (2) 克里斯二号
- (0)A
- (1) B
- (2) C
- (0)(学生)艾伦·泽罗
- (1) (老师)鲍勃一号
- (2) (学生)克里斯二号
- (0)A
- (一)
class Model extends DefaultHandler { String fileName; ArrayList<User> listOfUsers; Student student; Teacher teacher; boolean blnStudent = false; boolean blnTeacher = false; boolean blnName = false; boolean blnAge = false; boolean blnDOB = false; boolean blnGrade = false; boolean blnSubject = false; Model() { fileName = "school.xml"; listOfUsers = new ArrayList<User>(); } ArrayList<User> getListOfUsers() { if (validateXML() == true) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(new File(fileName), this); } catch (Exception error) { error.getMessage(); } } return listOfUsers; } boolean validateXML() { try { SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema schema = factory.newSchema(new File("school.xsd")); Validator validator = schema.newValidator(); Source source = new StreamSource(new File(fileName)); validator.validate(source); return true; } catch (Exception error) { error.getMessage(); return false; } } public void startElement(String uri, String localName, String tagName, Attributes attributes) throws SAXException { if (tagName.equalsIgnoreCase("student")) { student = new Student(attributes.getValue("id")); blnStudent = true; } else if (tagName.equalsIgnoreCase("teacher")) { teacher = new Teacher(attributes.getValue("id")); blnTeacher = true; } else if (tagName.equalsIgnoreCase("name")) { blnName = true; } else if (tagName.equalsIgnoreCase("age")) { blnAge = true; } else if (tagName.equalsIgnoreCase("dob")) { blnDOB = true; } else if (tagName.equalsIgnoreCase("grade")) { blnGrade = true; } else if (tagName.equalsIgnoreCase("subject")) { blnSubject = true; } } public void endElement(String uri, String localName, String tagName) throws SAXException { if (tagName.equalsIgnoreCase("student")) { listOfUsers.add(student); } else if (tagName.equalsIgnoreCase("teacher")) { listOfUsers.add(teacher); } } public void characters(char ch[], int start, int length) throws SAXException { if (blnStudent) { if (blnName) { student.setName(new String(ch, start, length)); blnName = false; } else if (blnAge) { student.setAge(new String(ch, start, length)); blnAge = false; } else if (blnDOB) { student.setDOB(new String(ch, start, length)); blnDOB = false; } else if (blnGrade) { student.setGrade(new String(ch, start, length)); blnGrade = false; blnStudent = false; } } else if (blnTeacher) { if (blnName) { teacher.setName(new String(ch, start, length)); blnName = false; } else if (blnAge) { teacher.setAge(new String(ch, start, length)); blnAge = false; } else if (blnDOB) { teacher.setDOB(new String(ch, start, length)); blnDOB = false; } else if (blnSubject) { teacher.setSubject(new String(ch, start, length)); blnSubject = false; blnTeacher = false; } } } void updateXML(int index, String fields[]) { try { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.parse(new File(fileName)); doc.getElementsByTagName("name") .item(index).setTextContent(fields[0]); doc.getElementsByTagName("age") .item(index).setTextContent(fields[1]); doc.getElementsByTagName("dob") .item(index).setTextContent(fields[2]); // IF STUDENT doc.getElementsByTagName("grade") .item(index).setTextContent(fields[3]); // ELSE TEACHER TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File(fileName)); transformer.transform(source, result); } catch (Exception error) { error.getMessage(); } } }
doc.getElementsByTagName("name").item(0).setTextContent("Alan Zero");