【问题标题】:Error in output of a simple SAX parser简单 SAX 解析器的输出错误
【发布时间】:2012-12-10 09:22:50
【问题描述】:

我在 mykong 看到了一个例子 - http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/ 我试图通过对上述页面中的代码进行以下修改来使其适用于 xml 文件(如下) -

1 - Have only two if blocks in startElement() and characters() methods.
2 - Change the print statements in above methods, ie 
    FIRSTNAME and First Name = passenger id
    LASTNAME and Last Name = name        

问题是 - 在输出中,我看到的是乘客这个词,而不是乘客 ID 的值。我该如何解决?

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:android="www.google.com">

<passenger id="001">
<name>Tom Cruise</name>
</passenger>

<passenger id="002">
<name>Tom Hanks</name>
</passenger>

</root>

Java 代码

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLFileSAX{

public static void main(String argv[]) {

try {

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

DefaultHandler handler = new DefaultHandler() {

boolean bfname = false;
boolean blname = false;

public void startElement(String uri, String localName,String qName, 
            Attributes attributes) throws SAXException {

    System.out.println("Start Element :" + qName);

    if (qName.equalsIgnoreCase("passenger id")) {
        bfname = true;
    }

    if (qName.equalsIgnoreCase("name")) {
        blname = true;
    }

}

public void endElement(String uri, String localName,
    String qName) throws SAXException {

    System.out.println("End Element :" + qName);

}

public void characters(char ch[], int start, int length) throws SAXException {

    if (bfname) {
        System.out.println("passenger id : " + new String(ch, start,   length));
        bfname = false;
    }

    if (blname) {
        System.out.println("name : " + new String(ch, start, length));
        blname = false;
    }

}

 };

   saxParser.parse("c:\\flight.xml", handler);

 } catch (Exception e) {
   e.printStackTrace();
   }

   }

}

【问题讨论】:

标签: java xml saxparser


【解决方案1】:

在 startElement 中,当它是“乘客”时,你得到的 Attributes 参数将具有该值。

public void startElement(String uri, String localName,
    String qName, Attributes attributes)
        throws SAXException {
    if (qName.equalsIgnoreCase("passenger") && attributes != null){
        System.out.println(attributes.getValue("id"));
    }
}

【讨论】:

  • 其实我没有正确理解主要代码。我修改了我的代码(如下),但我仍然看不到乘客 ID。 >>>>>>>>>>>>>>>>>>>>>>>>public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException { System.out.println ("起始元素:" + qName); if (localName.equalsIgnoreCase("passenger id")) { System.out.println("Passenger:" + attributes.getValue("id")); } if (qName.equalsIgnoreCase("passenger id")) { bfname = true; } if (qName.equalsIgnoreCase("name")) { blname = true; } }
  • 我已更新代码以在 startElement 中使用 qName。它比较并打印乘客 ID。
  • 我将 localName 更改为 qName,但我遇到了同样的问题 - 没有 id,只打印了乘客字。
  • 您正在使用 SAXParserFactory 和 SAXParser 的什么实现?它适用于我随 Java 7 一起提供的默认实现。
猜你喜欢
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多