Java 编写包含多个元素的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文件:

<?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");