使用SAXParser解析XML文件

时间:2011-06-30 06:14:49

标签: java parsing

我是新手,所以为什么当我想在StartElement()中打印NAME元素的值时,对于它打印的所有3个元素都是null?

class Test {
  public static void main(String args[]) {
    try {
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();
      DefaultHandler handler = new DefaultHandler() {


        public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
          if (qName.equals("NAME")) {
          String str = attributes.getValue("NAME");
           System.out.println(str);

          }
        }  
      };

      saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  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</NAME>" +
      "   <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>";
}

2 个答案:

答案 0 :(得分:1)

您的XML 没有任何属性。所以这个:

String str = attributes.getValue("NAME");
System.out.println(str);

......永远不会打印任何东西。

您希望通过它的外观打印出NAME元素的内容。因此,当您在 NAME元素中时,您需要处理characters事件。

顺便说一下,你 使用SAX吗?根据我的经验,与使用类似DOM的模型相比,这是一个痛苦的问题(例如使用JDOM或其他API - 内置的模型有点痛苦。)


如果您控制XML,另一种方法是使用属性启动

<PERSON NAME="Joe Wang"
        EMAIL="joe@yourserver.com"
        TELEPHONE="202-999-9999"
        WEB="www.java2s.com" />

然后您可以在获得attributes.getValue("NAME")元素时使用PERSON

答案 1 :(得分:1)

那是因为你试图从<NAME>元素(没有任何属性)读取属性。

String str = attributes.getValue("NAME");

要阅读<NAME>元素的内容,您必须覆盖characters (char ch[], int start, int length)的{​​{1}}方法,并显示返回的所有DefaultHandler(字符数组)。< / p>