使用 SAX 解析器时如何获取父节点?

Posted

技术标签:

【中文标题】使用 SAX 解析器时如何获取父节点?【英文标题】:How can I get parent node while i using SAX parser? 【发布时间】: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;
        

    

     ;

【问题讨论】:

【参考方案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 ...

【讨论】:

以上是关于使用 SAX 解析器时如何获取父节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中使用 DOM 或 SAX 解析器从 XML 读取子节点

PHP XMLReader 获取父节点?

Java 上下文 sax / stax 解析

java解析xml文件,会把节点属性中的换行转换成空格,怎样才能避免此类转换,即保留换行

如何在 android 中使用 SAX Parser 为解析的 xml 文件设置 UTF-8

在selenium2中,如何获取一个父节点下子节点的个数,所有的子节点的内容都有MOON