SAXParser - 处理XML结构中不同级别的相同文本的标记

时间:2013-03-15 21:54:18

标签: java xml xml-parsing saxparser

我想从SAXParser的新闻网站获取一些值。但它的结构对我来说很难,我是XML和SAX的新手。

问题:新闻网站使用SAME TAG NAME获取其XML的网站名称和新闻标题。

当我运行Java代码时它没有错误地运行但问题是关于输出。

我如何获取<item>代码的子代码:<title>?我不想在我的应用程序上显示网站标题。这对我来说是个大问题。

XML Side

<channel>

   <title>Site Name</title>

   <item>  
       <title>News Title!</title>       
   </item>

</channel>

Java Side

java文件中没有错误:)

try {

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

            DefaultHandler handler = new DefaultHandler() {

                boolean newsTitle   = false;


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

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

                    if (qName.equalsIgnoreCase("title")) {
                        newsTitle = 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 (newsTitle) {
                        System.out.println("Title : "
                                + new String(ch, start, length));
                        newsTitle = false;
                    }

                }

            };

            saxParser
                    .parse("C:\\ntv.xml",handler);

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

输出:

Title : Site Name

Title : News Title

2 个答案:

答案 0 :(得分:1)

您可以向DefaultHandler添加堆栈。当您在startElement中找到标签时,将标签推入堆栈,然后在endElement中将最顶层的标签弹出堆栈。如果您想知道文档中的位置,请检查堆栈是否包含/ title / item / title或just / title。

如果您不关心名称空间,请使用localName而不是qName。 qName可能有一个前缀名称空间。

您使用字符方法的方式也不正确(这是一个常见问题),请参阅SAX tutorial中的说明。

答案 1 :(得分:1)

您可以使用 XPath ,而不是使用SAX解析XML。

您的案例的XPath表达式是:

/channel/item/title

示例代码:

import org.xml.sax.InputSource;

import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.StringReader;

public class XPathTest {

    public static void main(String[] args) throws XPathExpressionException {

        String xml = "<channel>\n" +
                "\n" +
                "   <title>Site Name</title>\n" +
                "\n" +
                "   <item>  \n" +
                "       <title>News Title!</title>       \n" +
                "   </item>\n" +
                "\n" +
                "</channel>";

        Object result = XPathFactory.newInstance().newXPath().compile("/channel/item/title").evaluate(new InputSource(new StringReader(xml)));
        System.out.print(result);
    }
}