2

我想从一个带有SAXParser. 但它的结构对我来说很难,我是 XML 和 SAX 的新手。

问题:新闻站点使用相同的标签名称作为站点名称,并为其 XML 使用新闻标题。

当我运行 Java 代码时,它可以正常工作,但问题在于输出。

我怎样才能获取<item>标签的子标签:<title>?我不想在我的应用程序上显示网站标题。这对我来说是个大问题。

XML 端

<channel>

   <title>Site Name</title>

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

</channel>

Java 端

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
4

2 回答 2

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);
    }
}
于 2013-03-17T13:32:26.350 回答
1

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

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

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

于 2013-03-15T22:02:09.743 回答