【问题标题】:How can I get parent node while i using SAX parser?使用 SAX 解析器时如何获取父节点?
【发布时间】:2012-01-28 12:31:48
【问题描述】:

我需要在 java 中使用 SAX 解析器来解析文档。如果我使用传统上实现 startElement、endElement 和 characters 方法的 DefaultHandler 类,我能够打印所有节点值。我们如何才能访问子节点的前一个节点值,我该怎么做?
我的示例 XML 是:

<staff>
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff>
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>

基于薪水节点值,我还想访问名字。我很迷惑。我们该怎么做?我的示例代码:

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

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    boolean bnname = false;
    boolean bsalary = false;

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

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

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

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

        if (qName.equalsIgnoreCase("NICKNAME")) {
            bnname = true;
        }

        if (qName.equalsIgnoreCase("SALARY")) {
            bsalary = 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("First Name : " + new String(ch, start, length));
            bfname = false;
        }

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

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

        if (bsalary) {
            //System.out.println("Salary : " + new String(ch, start, length));
                    String nodeValue=new String(ch, start, length);
                    if(nodeValue.compareTo("100000")==0)
                   {
                     **????I need to store the respective respective first name
                         in ArrayList**
                    }
            bsalary = false;
        }

    }

     };

【问题讨论】:

    标签: java xml sax


    【解决方案1】:

    使用 SAX 时,您无法来回导航。您应该尝试使用 DOM。如果您必须使用 SAX,那么您可以使用 Stack 来保存以前的数据并根据需要弹出它们。

    【讨论】:

      【解决方案2】:

      您可以使用字符串变量将名称存储为

      public void characters(char ch[], int start, int length) throws SAXException {
          ... Code Here ...       
          if (bfname) {
              employeeName = new String(ch, start, length);
              bfname = false;
          }
          ... Code Here ...
      }
      

      & 在最后使用这个变量作为

          public void characters(char ch[], int start, int length) throws SAXException {
          ... Code Here ...
          if (bsalary) {
              String nodeValue=new String(ch, start, length);\
                  if(nodeValue.compareTo("100000")==0)
                  {
                      //Use employeeName Here...
                  }
              bsalary = false;
          }
          ... Code Here ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2011-01-05
        • 2011-06-17
        相关资源
        最近更新 更多