gpt4 book ai didi

java - SAX 解析和父/子关系

转载 作者:行者123 更新时间:2023-12-01 22:26:01 26 4
gpt4 key购买 nike

所以我面临这个问题,我需要解析 XML 文件来填充域对象。听起来很简单,但是,XML 文件中的元素可以具有未知数量的子元素,因此域对象可以具有指向该类的另一个对象的实例变量,该对象可以具有指向同一类的实例变量的变量等等。为了给您提供示例,这是为 XML 文件提供的示例:

<categories>
<category id="1">
<name>XML</name>
<category id="2">
<name>XPath</name>
</category>
<category id="3">
<name>XML Schema</name>
</category>
<category id="4">
<name>XSLT</name>
</category>
<category id="5">
<name>XSL-FO</name>
</category>
<category id="6">
<name>XQuery</name>
</category>
</category>
<category id="7">
<name>Java</name>
<category id="100">
<name>SDK</name>
<category id="8">
<name>Collections</name>
</category>
<category id="9">
<name>NIO</name>
</category>
<category id="10">
<name>Concurrency</name>
</category>
</category>
<category id="1000">
<name>EE</name>
<category id="11">
<name>EJB</name>
</category>
<category id="12">
<name>Web</name>
</category>
<category id="13">
<name>Webservices</name>
</category>
</category>
<category id="0">
<name>Examen boeken</name>
</category>
</category>
</categories>

我已经使用 DOM 解析器完成了此操作,但为了我的研究,我还需要使用 SAX 解析器完成此操作。我陷入了困境,我需要告诉哪个元素将哪个元素作为子元素以及哪个元素将哪个元素作为父元素。

到目前为止,我设法在 map 中获取所有类别条目,其中包含其 ID 和名称。

代码如下所示:

public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException {
Bookshelf mijnBookshelf = new Bookshelf("boekenfestijn");
Map<Integer, Category> categories = new HashMap<Integer, Category>();
// TODO inlezen
try {

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

DefaultHandler handler = new DefaultHandler() {

String reading = null;

boolean inCategory = false;
boolean inName = false;

int categoryId;

Category currentCategory;


public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {

if(qName.equalsIgnoreCase("CATEGORY") && attributes.getValue("id") != null){
inCategory = true;
categoryId = Integer.parseInt(attributes.getValue("id"));
System.out.println("START HANDLING ID -> " + attributes.getValue("id"));

}
if(qName.equalsIgnoreCase("NAME")){
inName = true;
}


}

public void endElement(String uri, String localName,
String qName) throws SAXException {


if(inCategory){
inCategory = false;
System.out.println("CATEGORY ID : " + categoryId + " NAME : " + reading);
currentCategory = new Category(categoryId, reading);
currentCategory.setBookshelf(mijnBookshelf);
categories.put(categoryId, currentCategory);
System.out.println("END HANDLING");
}

if(inName){
inName = false;
}



}













public void characters(char ch[], int start, int length)
throws SAXException {
reading = new String(ch, start, length);


}

};

saxParser.parse("bookshelf.xml", handler);

} catch (Exception e) {
e.printStackTrace();
}

for (Integer i : categories.keySet()) {
System.out.println("ID: " + categories.get(i).getId() + "->"
+ categories.get(i).getName());
}

对于“类别”类

public class Category {

private Integer id;
private String name;
private Category parent;
private List<Category> children = new ArrayList<Category>();
private Bookshelf bookshelf;

public Category(){

}

public Category(Integer id, String name) {
super();
this.id = id;
this.name = name;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Category getParent() {
return parent;
}

public void setParent(Category parent){
this.parent = parent;
}

public List<Category> getChildren() {
return children;
}

public String toString() {
String s = bookshelf.getName() + "/";
if (parent != null) {
s = parent.toString();
}
s += name + "/";
return s;
}

public Bookshelf getBookshelf() {
return bookshelf;
}

public void setBookshelf(Bookshelf bookshelf) {
this.bookshelf = bookshelf;
}

这就是我陷入困境的地方?我该如何继续定义父子关系?我如何知道处理程序中的任何一点哪个元素具有哪个元素作为子元素/父元素?

任何帮助将不胜感激!

TLDR:使用 sax 解析器填充域对象时如何定义父/子关系?

最佳答案

在 SAX 中,您无法直接知道哪个元素是另一个元素的父元素。处理此信息的常见方法是管理 LIFO 堆栈(例如 java.util.Stack)。您可以在 startElement() 方法上推送该元素,并在 endElement() 上弹出该元素。

不幸的是,在您通过 startElement()“遇到”子元素之前,无法预测它们。

关于java - SAX 解析和父/子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28785998/

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