2011-04-18 34 views
1

爲什麼SAXParseException爲getSystemId()返回null?什麼是系統標識符?SAXParseException爲getSystemId()返回null

import java.io.StringReader; 

    import javax.xml.parsers.SAXParser; 
    import javax.xml.parsers.SAXParserFactory; 

    import org.xml.sax.ErrorHandler; 
    import org.xml.sax.InputSource; 
    import org.xml.sax.SAXException; 
    import org.xml.sax.SAXParseException; 
    import org.xml.sax.XMLReader; 

    public class MainClass { 
     static public void main(String[] arg) throws Exception{ 
     boolean validate = false; 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setValidating(validate); 

     XMLReader reader = null; 
      SAXParser parser = spf.newSAXParser(); 
      reader = parser.getXMLReader(); 

     reader.setErrorHandler(new MyErrorHandler()); 
      reader.parse(new InputSource(new StringReader(xmlString))); 
    } 
     static String xmlString = "<PHONEBOOK>" + 
     " <PERSON>" + 
     " <NAME>Joe Wang</NAME>" + 
     " <EMAIL>[email protected]</EMAIL>" + 
     " <TELEPHONE>202-999-9999</TELEPHONE>" + 
     " <WEB>www.java2s.com</WEB>" + 
     " </PERSON>" + 
     " <PERSON> " + 
     "<NAME>Karol</NAE>" + // error here 
     " <EMAIL>[email protected]</EMAIL>" + 
     " <TELEPHONE>306-999-9999</TELEPHONE>" + 
     " <WEB>www.java2s.com</WEB>" + 
     " </PERSON>" + 
     " <PERSON>" + 
     " <NAME>Green</NAME>" + 
     " <EMAIL>[email protected]</EMAIL>" + 
     " <TELEPHONE>202-414-9999</TELEPHONE>" + 
     " <WEB>www.java2s.com</WEB>" + 
     " </PERSON>" + 
     " </PHONEBOOK>"; 
    } 
    class MyErrorHandler implements ErrorHandler { 
     public void warning(SAXParseException e) throws SAXException { 
     show("Warning", e); 
     throw (e); 
     } 

     public void error(SAXParseException e) throws SAXException { 
     show("Error", e); 
     throw (e); 
     } 

     public void fatalError(SAXParseException e) throws SAXException { 
     show("Fatal Error", e); 
     throw (e); 
     } 

     private void show(String type, SAXParseException e) { 
     System.out.println(type + ": " + e.getMessage()); 
     System.out.println("Line " + e.getLineNumber() + " Column " 
      + e.getColumnNumber()); 
     System.out.println("System ID: " + e.getSystemId()); 
     System.out.println(e); 

     } 
    } 

回答

4

XML中的「系統標識符」是您從中得到的物理位置。當你在內存中解析一個字符串時,除非你打一個額外的電話給它,否則它根本沒有系統標識符。

在這種情況下,您可以撥打InputSource.setSystemId

1

系統標識符是一個可以指定的URI,它在那裏,所以它可以被EntityResolver用來決定在xml解析過程中如何解決相對路徑。無論是實際位置還是標籤都取決於您。當然,在你的例子中,你沒有任何東西需要解決,所以不需要。