XML 的问题
我有一个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);
}
}
请高人指教。
[解决办法]
<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>
----------------
从这两个 <FULLTIMESTAFF> 元素的比较就可以看到他们的不同之处。
有 <MANAGER/> 元素的表示此人是经理,没有的表示是普通员工,这当然是有用的。
我觉得更好的解决办法是:不要在dtd中设置Manager的值为Empty,最好也设成(#PCDATA),这样就好解析了。
