SAXParseException为getSystemId()返回null

问题描述:

为什么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); 

     } 
    } 

XML中的“系统标识符”是您从中得到的物理位置。当你在内存中解析一个字符串时,除非你打一个额外的电话给它,否则它根本没有系统标识符。

在这种情况下,您可以拨打InputSource.setSystemId

系统标识符是一个可以指定的URI,它在那里,所以它可以被EntityResolver用来决定在xml解析过程中如何解决相对路径。无论是实际位置还是标签都取决于您。当然,在你的例子中,你没有任何东西需要解决,所以不需要。