繁体   English   中英

使用 SAXParser 解析 XML 文件

[英]Parse XML file with SAXParser

我是新手,所以为什么当我想在 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>";
}

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

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

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

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

顺便说一句,您必须使用 SAX 吗? 以我的经验,与使用类似 DOM 的 model 相比(例如使用JDOM或其他 API - 内置的有点痛苦),这是一种痛苦。


如果您控制 XML,另一种方法是开始使用属性:

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

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

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

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

要读取<NAME>元素的内容,您必须覆盖DefaultHandlercharacters (char ch[], int start, int length)方法并显示所有返回的ch[] (字符数组)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM