我需要解析XML文件以获取xml文件中存在的标记值。我已经部分地完成了它并且在中间被困住了。我的xml文件如下,(示例xml文件)
<?xml version="1.0" encoding="UTF-8"?>
<database>
<student name="abc">
<phone>6879987</phone>
<dept>eee</dept>
<college>act</college>
<semester>
<year>2</year>
<no.of.sub>7</no.of.sub>
</semester>
<hostel>
<year>3</year>
<block>d4</block>
</hostel>
</student>
<student name="ram">
<phone>65464</phone>
<dept>cse</dept>
<college>Mit</college>
<semester>
<year>4</year>
<no.of.sub>5</no.of.sub>
</semester>
<hostel>
<year>5</year
<block>y4</block>
</hostel>
</student>
</database>
我的实施如下,
public class MySaxParser extends DefaultHandler {
private String temp;
private ArrayList<Account> accList = new ArrayList<Account>();
private Account acct;
public static void main(String[] args) throws IOException, SAXException,
ParserConfigurationException {
SAXParserFactory spfac = SAXParserFactory.newInstance();
SAXParser sp = spfac.newSAXParser();
MySaxParser handler = new MySaxParser();
sp.parse("test.xml", handler);
handler.readList();
}
@Override
public void characters(char[] buffer, int start, int length) {
temp = new String(buffer, start, length);
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
temp = "";
if (qName.equalsIgnoreCase("Student")) {
acct = new Account();
//acct.setType(attributes.getValue("type"));
}
}
@override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("Student")) {
// add it to the list
accList.add(acct);
} else if (qName.equalsIgnoreCase("phone")) {
acct.setphone(temp);
} else if (qName.equalsIgnoreCase("dept")) {
acct.setdept((temp));
} else if (qName.equalsIgnoreCase("College")) {
acct.setcollege(temp);
}
}
private void readList() {
Iterator<Account> it = accList.iterator();
while (it.hasNext()) {
System.out.println(it.next().toString());
}
}
}
我可以解析电话,大学学院的价值观。但是年标是学期和宿舍的子标签。我需要同时获得年份值。当我只是使用时,
else if (qName.equalsIgnoreCase("year")) {
acct.setyear(temp);
只有年份宿舍的价值才会在学期开始时被打印出来。 1)我如何解析这些子标签。提前致谢
答案 0 :(得分:0)
是的,那是因为宿舍标签在学期后出现。所以,你总是拥有最新的标签。如果要打印两者,可以使用一些布尔标志,如isSemester和isHotel,并在遇到它们时设置它们。然后,当您遇到年份时,请检查这些标志,并查看“当前年份”与哪一个相关。
答案 1 :(得分:0)
您需要一种方法来“记住”您是否输入了hostel
标签。最简单的方法是在startElement
内执行以下操作:
if (qName.equalsIgnoreCase("hostel")) {
this.insideHostel = true;
}
在endElement
:
if (qName.equalsIgnoreCase("hostel")) {
this.insideHostel = false;
}
现在你可以做到:
} else if (qName.equalsIgnoreCase("year") && insideHostel) {
acct.setyear(temp);
}
答案 2 :(得分:0)
示例xml文件,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Issue>
<Primary>
<Section>
String a=null;
if(a==null) hi;);
else bye;;
}
</Section>
</Primary>
<Source>
<Section>
String a="sbi";
if(a==null) hi;);
else bye;;
</Section>
</Source>
</Issue>
我需要获取section标签中的所有字符。我的实现如下,
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase("Issue")) {
accList.add(acct);
}
if (qName.equalsIgnoreCase("Primary")) {
this.isPrimary=false;
}
if (qName.equalsIgnoreCase("Source")) {
this.isSource=false;
}
else if(qName.equalsIgnoreCase("section")&&isPrimary)
{
acct.setPrimarySnippet(temp);
}
else if(qName.equalsIgnoreCase("Section")&&isSource)
{
acct.setSourceSnippet(temp);
}
o / p是:别再见;; },