Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML文件解析为链接的java对象_Java_Xml_Parsing - Fatal编程技术网

将XML文件解析为链接的java对象

将XML文件解析为链接的java对象,java,xml,parsing,Java,Xml,Parsing,我在XML文件上使用SAX解析器来创建相互引用的对象 <?xml version="1.0"?> <xml encoding="UTF-8" version="1.0"> <course number="CSC212"> <textbook name="BookFor212"/> </course> <course number="CSC241"> <prereq number="CSC212"/

我在XML文件上使用SAX解析器来创建相互引用的对象

<?xml version="1.0"?>
<xml encoding="UTF-8" version="1.0"> 
 <course number="CSC212">
  <textbook name="BookFor212"/> 
 </course> 
 <course number="CSC241"> 
  <prereq number="CSC212"/>
  <textbook name="BookFor241"/> 
  <textbook name="AnotherBookFor241"/> 
 </course> 
 <course number="CSC455"> 
  <prereq number="CSC241"/> 
  <prereq number="CSC365"/> 
  <textbook name="BookFor455"/> 
 </course> 
 <course number="CSC365"> 
  <prereq number="CSC241"/> 
  <textbook name="BookFor365"/> 
  <textbook name="AnotherBookFor365"/> 
  <textbook name="YetAnotherBookFor365"/> 
 </course> 
</xml>

因此,我创建了一个课程,并将教科书和预科添加到课程中相应的数组中,完成后,我将该课程添加到数组中。解析完成后,系统会提示用户输入课程号,程序会输出信息,包括预科和他们需要的所有内容,以及他们的课本和预科

public class Course {
private String number;
private Course[] prereqs = new Course[5];
private int pCounter = 0;
private Textbook[] books = new Textbook[5];
private int tCounter = 0;

public Course(String n) {
  number = n;
}

public String getNumber() {
  return number;
}

public void addPrereq(Course prereq) {
  prereqs[pCounter++] = prereq;
}

public void addTextbook(Textbook book) {
  books[tCounter++] = book;
}

public String toString() {
  String retVal = "Course: " + number + (tCounter == 0 ? ", No books." : ", textbooks:   ");
  for (int i = 0; i < tCounter; i++)
    retVal += books[i].toString() + " ";
  retVal += "\n" + (pCounter == 0 ? "No prerequisites.\n" : "Prerequisites:\n");
  for (int i = 0; i < pCounter; i++)
    retVal += prereqs[i].toString();
  return retVal + "End of course " + number + ".\n";
}
}
公共课{
私有字符串编号;
私人课程[]预需求=新课程[5];
私有int pCounter=0;
私人教科书[]本=新教科书[5];
专用int计数器=0;
公共课程(字符串n){
数字=n;
}
公共字符串getNumber(){
返回号码;
}
公共无效添加预请求(课程预请求){
prereqs[pCounter++]=prereq;
}
公共教科书(教科书){
书籍[tCounter++]=书籍;
}
公共字符串toString(){
String retVal=“课程:”+number+(tCounter==0?”,无书籍:“,教科书:”;
for(int i=0;i

问题是,在添加prereqs时,我会查看已经创建的课程数组,如果有,就使用它,如果没有,就创建一个新的。因此,如果它不在那里,我添加一个课程,除了它的编号之外没有任何信息。因此,我最终的课程CSC455有一个预需求CSC365,但没有列出教科书或预需求。我如何才能做到这一点,使预科成为已完成的课程?

您需要维护一个
地图来查找您的课程。每当您遇到新的
课程
或参考资料时,请检查地图,然后将新的
课程
放入地图中。通过这种方式,您可以从req创建
课程
,然后在以后添加信息

我建议在
课程中使用
List
s或
Set
s,因为这意味着当你有超过5本教科书时,你将无法获得
ArrayOutOfBounds

public class Course {

    private String number;
    private List<Course> prereqs = new LinkedList<Course>();
    private List<Textbook> books = new LinkedList<Textbook>();

    public Course(String n) {
        number = n;
    }

    public String getNumber() {
        return number;
    }

    public void addPrereq(Course prereq) {
        prereqs.add(prereq);
    }

    public void addTextbook(Textbook book) {
        books.add(book);
    }

    public String toString() {
        String retVal = "Course: " + number + (books.isEmpty() ? ", No books." : ", textbooks:   ");
        for (final Textbook  book : books) {
            retVal += book.toString() + " ";
        }
        retVal += "\n" + (prereqs.isEmpty() ? "No prerequisites.\n" : "Prerequisites:\n");
        for (final Course course : prereqs) {
            retVal += course.toString();
        }
        return retVal + "End of course " + number + ".\n";
    }
}

因此,现在在解析器的顶部创建一个
CourseFactory
,并使用它来获取课程。它将确保您始终引用同一个。

您需要维护一个
地图来查找您的课程。每当您遇到新的
课程
或参考资料时,请检查地图,然后将新的
课程
放入地图中。通过这种方式,您可以从req创建
课程
,然后在以后添加信息

我建议在
课程中使用
List
s或
Set
s,因为这意味着当你有超过5本教科书时,你将无法获得
ArrayOutOfBounds

public class Course {

    private String number;
    private List<Course> prereqs = new LinkedList<Course>();
    private List<Textbook> books = new LinkedList<Textbook>();

    public Course(String n) {
        number = n;
    }

    public String getNumber() {
        return number;
    }

    public void addPrereq(Course prereq) {
        prereqs.add(prereq);
    }

    public void addTextbook(Textbook book) {
        books.add(book);
    }

    public String toString() {
        String retVal = "Course: " + number + (books.isEmpty() ? ", No books." : ", textbooks:   ");
        for (final Textbook  book : books) {
            retVal += book.toString() + " ";
        }
        retVal += "\n" + (prereqs.isEmpty() ? "No prerequisites.\n" : "Prerequisites:\n");
        for (final Course course : prereqs) {
            retVal += course.toString();
        }
        return retVal + "End of course " + number + ".\n";
    }
}

因此,现在在解析器的顶部创建一个
CourseFactory
,并使用它来获取课程。它将确保您始终引用同一个;在课程上存储
字符串
prereq,然后创建
Map
并在课程上使用某种方法
resolvepreq(最终Map lookupMap)
你循环并在之后调用。如果你为你的
课程添加源代码
,将更容易明确解决方案。这是我想做的,但我不确定如何做。你需要进行两次分析;在课程上存储
字符串
prereq,然后创建
Map
并在课程上使用某种方法
resolvepreq(最终Map lookupMap)
您可以循环并随后调用。如果您为
课程添加源代码,则更容易明确解决方案。这是我想做的,但我不确定如何做。