gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:57 27 4
gpt4 key购买 nike

我在 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>

因此,我创建了一门类(class),并将教科书和先决条件添加到类(class)中各自的数组中,最后,我将该类(class)添加到一个数组中。解析后,系统会提示用户输入类(class)编号,程序会输出信息,包括先决条件及其所需的所有内容,以及他们的教科书和先决条件。

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";
}
}

问题是,在添加先决条件时,我会查看已创建的类(class)数组,如果存在则使用它,如果不存在则创建一个新类(class)。因此,如果不存在,我会添加一门除了编号之外没有任何信息的类(class)。所以我最终得到了 CSC455 类(class),它有一个先决条件 CSC365,但没有列出教科书或先决条件。我怎样才能做到这一点,以便先决条件成为完成的类(class)?

最佳答案

您需要维护 Map查找您的类(class)。每当您遇到新的 Course或引用您检查 map ,然后输入新的 Course进入 map 。这样你就可以创建一个Course来自请求,然后稍后添加信息。

我建议使用ListSet在你的 Course 中因为这意味着您不会得到 ArrayOutOfBounds当您有超过 5 本教科书时。

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";
}
}

现在您需要存储 Map<String, Course>并添加 getCourse()您使用的方法而不是构建新类(class) - 这是工厂模式:

private class CourseFactory {

private final Map<String, Course> courseMap;

public CourseFactory(final Map<String, Course> courseMap) {
this.courseMap = courseMap;
}

public Course getCourse(final String name) {
Course course = courseMap.get(name);
if(course == null) {
course = new Course(name);
courseMap.put(name, course);
}
return course;
}
}

所以现在在解析器的顶部创建一个 CourseFactory并用它来获取您的类(class)。它将确保您始终引用相同的内容。

关于java - 将 XML 文件解析为链接的 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com