SAXParseException возвращает ноль для getSystemId () - PullRequest
1 голос
/ 19 апреля 2011

Почему SAXParseException возвращает null для getSystemId ()?Что такое системный идентификатор?

    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>joe@yourserver.com</EMAIL>" +
      "   <TELEPHONE>202-999-9999</TELEPHONE>" +
      "   <WEB>www.java2s.com</WEB>" +
      "  </PERSON>" +
      "  <PERSON>   " +
      "<NAME>Karol</NAE>" +    // error here
      "   <EMAIL>karol@yourserver.com</EMAIL>" +
      "   <TELEPHONE>306-999-9999</TELEPHONE>" +
      "   <WEB>www.java2s.com</WEB>" +
      "  </PERSON>" +
      "  <PERSON>" +
      "   <NAME>Green</NAME>" +
      "   <EMAIL>green@yourserver.com</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);

      }
    }

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

«Системный идентификатор» в XML - это физическое местоположение, из которого вы что-то получили. Когда вы просто анализируете строку в памяти, она вообще не имеет системного идентификатора, если только вы не сделаете дополнительный вызов, чтобы присвоить ее.

В этом случае вы можете позвонить InputSource.setSystemId.

1 голос
/ 19 апреля 2011

Системный идентификатор - это URI, который вы можете указать, он существует, поэтому он может использоваться EntityResolver для определения того, как относительные пути разрешаются во время анализа XML.Будь то физическое местоположение или просто ярлык, решать только вам.Конечно, в вашем примере вам не нужно ничего решать, так что это не нужно.

...