java - SAXParser - 处理 XML 结构中不同级别的具有相同文本的标签

标签 java xml xml-parsing saxparser

我想使用 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

最佳答案

您可以使用 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);
    }
}

关于java - SAXParser - 处理 XML 结构中不同级别的具有相同文本的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442707/

相关文章:

java - jaxb 是否有可能在基于 xsd 的验证过程中显示更多错误

java - 在类 'dataSource' 中找不到属性 'org.springframework.security.provisioning.JdbcUserDetailsManager' 的 setter

java - 使用 Xerces 忽略奇怪的解析错误

android - 如何使用按钮单击从android中的xml feed打开url

java - 使用 SAX 解析器动态读取标签

java - 如何使用 Hyperic Sigar 获取 CPU ID 或序列号?

java - MVC 模式和 Swing

xml - Xpath 检查节点是否为空或文本是否为空

java - struts2中的日期更改问题

java - 单击按钮后如何更改 JTable 行的颜色