我想从SAXParser
的新闻网站获取一些值。但它的结构对我来说很难,我是XML和SAX的新手。
问题:新闻网站使用SAME TAG NAME获取其XML的网站名称和新闻标题。
当我运行Java代码时它没有错误地运行但问题是关于输出。
我如何仅获取<item>
代码的子代码:<title>
?我不想在我的应用程序上显示网站标题。这对我来说是个大问题。
<channel>
<title>Site Name</title>
<item>
<title>News Title!</title>
</item>
</channel>
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
答案 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);
}
}