我有一个XML 的文件当我用JAVA SAX 把它的资料拿出的时候遇到<MANAGER/>这个是代表什么意思呢?我应该怎么把是不是MANAGER这个元素拿出来呢 拿出来呢?
--------------------------------------------------------------
xml 文件
<?xml version ="1.0" standalone = "yes"?>
<!DOCTYPE COMPANY [
<!ELEMENT COMPANY (DEPARTMENT+)>
<!ELEMENT DEPARTMENT (STAFFLIST)>
<!ATTLIST DEPARTMENT
NAME CDATA #REQUIRED
>
<!ELEMENT STAFFLIST (FULLTIMESTAFF|PARTTIMESTAFF)+>
<!ELEMENT FULLTIMESTAFF (NAME, ID, SALARY, MANAGER?)>
<!ELEMENT PARTTIMESTAFF (NAME, ID, HOURLYSALARY)>
<!ELEMENT SALARY (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT MANAGER EMPTY>
<!ELEMENT HOURLYSALARY (#PCDATA)>
]>
<COMPANY>
<DEPARTMENT NAME = "Product Development">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> John Tan Seng Huat</NAME>
<ID> S6512345J </ID>
<SALARY>4500.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF >
<NAME> Peter Chua Sim Lai</NAME>
<ID> S6934345C </ID>
<SALARY>2800.00</SALARY>
</FULLTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Cindy Lam Lian Choo</NAME>
<ID> S6734322K </ID>
<HOURLYSALARY>35.00</HOURLYSALARY>
</PARTTIMESTAFF>
<FULLTIMESTAFF >
<NAME> Anisah Bte Ismail </NAME>
<ID> S6922339B </ID>
<SALARY>3100.00</SALARY>
</FULLTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
<DEPARTMENT NAME = "Customer Service">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> Noor Ali Bin Mohamed </NAME>
<ID> S6412388J </ID>
<SALARY>4200.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF>
<NAME> Hanisah Bte Salleh </NAME>
<ID> S6934311F </ID>
<SALARY>1800.00</SALARY>
</FULLTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
<DEPARTMENT NAME = "Sales and Publicity">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> Linda Peh Xue Li</NAME>
<ID> S6423451J </ID>
<SALARY>3500.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF>
<NAME> Thomas Lye Meng Poh</NAME>
<ID> S7234344F </ID>
<SALARY>1800.00</SALARY>
</FULLTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Eugene Oliver John</NAME>
<ID> S7533213F </ID>
<HOURLYSALARY>12.00</HOURLYSALARY>
</PARTTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Mariah Bte Syafik </NAME>
<ID> S7835613C </ID>
<HOURLYSALARY>10.00</HOURLYSALARY>
</PARTTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
</COMPANY>-----------------------------
java 文件
package tma02q3jan2007;
import java.util.*;
import org.xml.sax.*;
import java.text.NumberFormat;
public class StaffDataProcessor extends HandlerBase{// instance variables, if any
String department;
double salary;
String id;
String name;
boolean isManager=true;
double hourlySalary;
String tag;
//flags to indicate where we are
boolean hasAttribute;
//create staffdata
StaffData data;
public static void main(String[] args){
//Main method
//Sets up the XML parser and connects it to the file catalogue.txt
try
{
Class loadedClass = Class.forName("com.ibm.xml.parser.SAXDriver");
Parser xParser = (Parser)loadedClass.newInstance();
StaffDataProcessor sdp = new StaffDataProcessor();
xParser.setDocumentHandler(sdp);
xParser.setErrorHandler(sdp);
xParser.parse("company.txt");
}
catch(Exception e)
{System.out.println("Problem starting XML processor "+e.getMessage());}
}
public void error(SAXParseException se){
// Executed when a serious error occurs in processing the
// XML source
System.out.println("Error: Problem in processing"
+se.getMessage());
} public void warning(SAXParseException se){
// Executed when a minor problem occurs when processing the
// XML source
System.out.println("Warning: Problem in processing "
+se.getMessage());
} public void startDocument() throws SAXException{
//Executed when the start of an element is encountered
data=new StaffData();
System.out.println("...Processing started");
}
public void startElement(String elementName, AttributeList al) throws SAXException{
//Executed when the start of an element is encountered
tag = elementName;
if (elementName.equals("DEPARTMENT")){
// check whether there is any attributes
if (al.getLength() == 1) {
hasAttribute = true;
department =al.getValue(0);
}
else hasAttribute = false;
}
} public void endElement(String elementName) throws SAXException{
//Executed when the end of an element is encountered
if (elementName.equals("PARTTIMESTAFF")) {
data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// should add the information here to the database,
// since the XML record has been read
//if(elementName.equals("STAFFLIST")){
//data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// if (hasAttribute){
//if(elementName.equals("PARTTIMESTAFF")){
//data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// }
}
else if(elementName.equals("FULLTIMESTAFF")){
if(elementName.equals("MANAGER"))
data.createFullTimeStaffRecord(department,name,id,salary,true);
else data.createFullTimeStaffRecord(department,name,id,salary,false);
}
// }
//}
} public void endDocument() throws SAXException{
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
String partDetail=data.getDetails("PARTTIMESTAFF");
System.out.println(partDetail);
System.out.println("");
double partTotalSalary=data.getTotalSalary("PARTTIMESTAFF");
System.out.println("Total HourlySalary "+nf.format(partTotalSalary));
System.out.println("");
System.out.println("");
String fulDetail=data.getDetails("FULLTIMESTAFF");
System.out.println(fulDetail);
System.out.println("");
double fulTotalSalary=data.getTotalSalary("FULLTIMESTAFF");
System.out.println("Total Monthly Salary "+nf.format(fulTotalSalary));
//Executed when processing is finished
System.out.println("");
System.out.println("...finished processing document"); } public void characters(char[] chars, int start, int length)throws
SAXException{
//String processing
String stringRead = new String(chars, 0, length);
String s= "";
boolean isManager=true;
//Check flags and save as per flag status
if (tag.equals("NAME"))
name = stringRead;
else if (tag.equals("ID"))
id = stringRead;
else if (tag.equals("MANAGER/"))
stringRead="**Manager**";
else if(tag.equals("SALARY"))
salary =Double.parseDouble(stringRead);
else if(tag.equals("HOURLYSALARY"))
hourlySalary=Double.parseDouble(stringRead);
}
}
请高人指教。
--------------------------------------------------------------
xml 文件
<?xml version ="1.0" standalone = "yes"?>
<!DOCTYPE COMPANY [
<!ELEMENT COMPANY (DEPARTMENT+)>
<!ELEMENT DEPARTMENT (STAFFLIST)>
<!ATTLIST DEPARTMENT
NAME CDATA #REQUIRED
>
<!ELEMENT STAFFLIST (FULLTIMESTAFF|PARTTIMESTAFF)+>
<!ELEMENT FULLTIMESTAFF (NAME, ID, SALARY, MANAGER?)>
<!ELEMENT PARTTIMESTAFF (NAME, ID, HOURLYSALARY)>
<!ELEMENT SALARY (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT MANAGER EMPTY>
<!ELEMENT HOURLYSALARY (#PCDATA)>
]>
<COMPANY>
<DEPARTMENT NAME = "Product Development">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> John Tan Seng Huat</NAME>
<ID> S6512345J </ID>
<SALARY>4500.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF >
<NAME> Peter Chua Sim Lai</NAME>
<ID> S6934345C </ID>
<SALARY>2800.00</SALARY>
</FULLTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Cindy Lam Lian Choo</NAME>
<ID> S6734322K </ID>
<HOURLYSALARY>35.00</HOURLYSALARY>
</PARTTIMESTAFF>
<FULLTIMESTAFF >
<NAME> Anisah Bte Ismail </NAME>
<ID> S6922339B </ID>
<SALARY>3100.00</SALARY>
</FULLTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
<DEPARTMENT NAME = "Customer Service">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> Noor Ali Bin Mohamed </NAME>
<ID> S6412388J </ID>
<SALARY>4200.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF>
<NAME> Hanisah Bte Salleh </NAME>
<ID> S6934311F </ID>
<SALARY>1800.00</SALARY>
</FULLTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
<DEPARTMENT NAME = "Sales and Publicity">
<STAFFLIST>
<FULLTIMESTAFF>
<NAME> Linda Peh Xue Li</NAME>
<ID> S6423451J </ID>
<SALARY>3500.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF>
<FULLTIMESTAFF>
<NAME> Thomas Lye Meng Poh</NAME>
<ID> S7234344F </ID>
<SALARY>1800.00</SALARY>
</FULLTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Eugene Oliver John</NAME>
<ID> S7533213F </ID>
<HOURLYSALARY>12.00</HOURLYSALARY>
</PARTTIMESTAFF>
<PARTTIMESTAFF>
<NAME> Mariah Bte Syafik </NAME>
<ID> S7835613C </ID>
<HOURLYSALARY>10.00</HOURLYSALARY>
</PARTTIMESTAFF>
</STAFFLIST>
</DEPARTMENT>
</COMPANY>-----------------------------
java 文件
package tma02q3jan2007;
import java.util.*;
import org.xml.sax.*;
import java.text.NumberFormat;
public class StaffDataProcessor extends HandlerBase{// instance variables, if any
String department;
double salary;
String id;
String name;
boolean isManager=true;
double hourlySalary;
String tag;
//flags to indicate where we are
boolean hasAttribute;
//create staffdata
StaffData data;
public static void main(String[] args){
//Main method
//Sets up the XML parser and connects it to the file catalogue.txt
try
{
Class loadedClass = Class.forName("com.ibm.xml.parser.SAXDriver");
Parser xParser = (Parser)loadedClass.newInstance();
StaffDataProcessor sdp = new StaffDataProcessor();
xParser.setDocumentHandler(sdp);
xParser.setErrorHandler(sdp);
xParser.parse("company.txt");
}
catch(Exception e)
{System.out.println("Problem starting XML processor "+e.getMessage());}
}
public void error(SAXParseException se){
// Executed when a serious error occurs in processing the
// XML source
System.out.println("Error: Problem in processing"
+se.getMessage());
} public void warning(SAXParseException se){
// Executed when a minor problem occurs when processing the
// XML source
System.out.println("Warning: Problem in processing "
+se.getMessage());
} public void startDocument() throws SAXException{
//Executed when the start of an element is encountered
data=new StaffData();
System.out.println("...Processing started");
}
public void startElement(String elementName, AttributeList al) throws SAXException{
//Executed when the start of an element is encountered
tag = elementName;
if (elementName.equals("DEPARTMENT")){
// check whether there is any attributes
if (al.getLength() == 1) {
hasAttribute = true;
department =al.getValue(0);
}
else hasAttribute = false;
}
} public void endElement(String elementName) throws SAXException{
//Executed when the end of an element is encountered
if (elementName.equals("PARTTIMESTAFF")) {
data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// should add the information here to the database,
// since the XML record has been read
//if(elementName.equals("STAFFLIST")){
//data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// if (hasAttribute){
//if(elementName.equals("PARTTIMESTAFF")){
//data.createPartTimeStaffRecord(department,name,id,hourlySalary);
// }
}
else if(elementName.equals("FULLTIMESTAFF")){
if(elementName.equals("MANAGER"))
data.createFullTimeStaffRecord(department,name,id,salary,true);
else data.createFullTimeStaffRecord(department,name,id,salary,false);
}
// }
//}
} public void endDocument() throws SAXException{
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
String partDetail=data.getDetails("PARTTIMESTAFF");
System.out.println(partDetail);
System.out.println("");
double partTotalSalary=data.getTotalSalary("PARTTIMESTAFF");
System.out.println("Total HourlySalary "+nf.format(partTotalSalary));
System.out.println("");
System.out.println("");
String fulDetail=data.getDetails("FULLTIMESTAFF");
System.out.println(fulDetail);
System.out.println("");
double fulTotalSalary=data.getTotalSalary("FULLTIMESTAFF");
System.out.println("Total Monthly Salary "+nf.format(fulTotalSalary));
//Executed when processing is finished
System.out.println("");
System.out.println("...finished processing document"); } public void characters(char[] chars, int start, int length)throws
SAXException{
//String processing
String stringRead = new String(chars, 0, length);
String s= "";
boolean isManager=true;
//Check flags and save as per flag status
if (tag.equals("NAME"))
name = stringRead;
else if (tag.equals("ID"))
id = stringRead;
else if (tag.equals("MANAGER/"))
stringRead="**Manager**";
else if(tag.equals("SALARY"))
salary =Double.parseDouble(stringRead);
else if(tag.equals("HOURLYSALARY"))
hourlySalary=Double.parseDouble(stringRead);
}
}
请高人指教。
<NAME> John Tan Seng Huat</NAME>
<ID> S6512345J </ID>
<SALARY>4500.00</SALARY>
<MANAGER/>
</FULLTIMESTAFF><FULLTIMESTAFF>
<NAME> Peter Chua Sim Lai</NAME>
<ID> S6934345C </ID>
<SALARY>2800.00</SALARY>
</FULLTIMESTAFF>
----------------
从这两个<FULLTIMESTAFF>元素的比较就可以看到他们的不同之处。
有<MANAGER/>元素的表示此人是经理,没有的表示是普通员工,这当然是有用的。
我觉得更好的解决办法是:不要在dtd中设置Manager的值为Empty,最好也设成(#PCDATA),这样就好解析了。