SAX解析xml

本文介绍了一个使用SAX解析器解析XML文件的Java示例。通过继承DefaultHandler类并重写其方法,可以实现对XML文档的高效解析。文章展示了如何提取XML中的章节和主题信息,并提供了完整的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.FileInputStream;
import java.io.OutputStreamWriter;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * 读取出来的内容可以进一步处理,比如插入数据库,
 * 文件过大可以分段保存到数据库,以免内存溢出
 * 
 *
 */
public class MySaxXml extends DefaultHandler {

	/**
	 * @param args
	 * @throws SAXException
	 * @throws Exception
	 */
	private Locator locator;
	private int index1 = 0;
	private int index2 = 0;
	//测试保存数据
	private StringBuffer content = new StringBuffer();

	// 读取标签之间的内容,如:<xxx>tttt</xxx>
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String tmp = new StringBuffer().append(ch, start, length).toString()
				.trim();
		if (tmp.length() == 0) {
			return;
		}
		System.out.print("本书<<");
		try {
			OutputStreamWriter outw = new OutputStreamWriter(System.out);
			outw.write(ch, start, length);
			outw.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(content.capacity()>30*1000){
			content.delete(0, content.length());
			System.out.println(content.capacity());
		}else{
			content.append(ch, start, length);
		}
		System.out.println(">>的目录");
	}

	public void endDocument() throws SAXException {
		System.out.println("解析结束:");
	}

	// 遇到结束标签,在此可以做其它业务处理,因为是结束标签处表示一条数据的完整性
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		
		if (qName.equalsIgnoreCase("chapter"))
			this.index2 = 0;
	}

	public void setDocumentLocator(Locator locator) {
		this.locator = locator;
	}

	public void startDocument() throws SAXException {
		System.out.println("解析开始: ");
	}

	// 重写开始解析元素的方法. 这里是将<xxx>中的名称xxx提取出来,与读取属性
	public void startElement(String uri, String localName, String qName,
			Attributes atts) throws SAXException {
		if (qName.equalsIgnoreCase("chapter")) {
			index1++;
			for (int i = 0; i < atts.getLength(); i++) {
				String attName = atts.getQName(i);
				if (attName.equalsIgnoreCase("title")) {
					System.out.println("第" + index1 + "章:" + atts.getValue(i));
				}
			}
		}

		if (qName.equalsIgnoreCase("topic")) {
			index2++;
			for (int i = 0; i < atts.getLength(); i++) {
				String attName = atts.getQName(i);
				if (attName.equalsIgnoreCase("name")) {
					System.out.println("     第" + index2 + "部分:"
							+ atts.getValue(i));
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		String vendorParserClass = "org.apache.xerces.parsers.SAXParser";
		String xmlURI = "D:\\book2.xml";
		XMLReader reader = XMLReaderFactory.createXMLReader(vendorParserClass);
		reader.setContentHandler(new MySaxXml());
		InputSource inputSource = new InputSource(new FileInputStream(xmlURI));
		//开始解析xml文件,会自动回调上面重写的方法
		reader.parse(inputSource);
	}
}

 下面是对应xml:

<?xml version="1.0"?>
<book>
    <title>Java and XML</title> 
    <contents>
        <chapter title="Introduction" number="1">
            <topic name="XML Matters"/> 
            <topic name="What's Important"/>
            <topic name="The Essentials"/>
            <topic name="What&apos;s Next?"/>
        </chapter>
        <chapter title="Nuts and Bolts" number="2">
            <topic name="The Basics"/>
            <topic name="Constraints"/>
            <topic name="Transformations"/>
            <topic name="And More..."/>
            <topic name="What&apos;s Next?"/>
        </chapter>
        <chapter title="SAX" number="3">
            <topic name="Getting Prepared"/>
            <topic name="SAX Readers"/>
            <topic name="Content Handlers"/>
            <topic name="Gotcha!"/>
            <topic name="What&apos;s Next?"/>
        </chapter>       
    </contents>
</book>

 

### IntelliJ IDEA 中通义 AI 功能介绍 IntelliJ IDEA 提供了一系列强大的工具来增强开发体验,其中包括与通义 AI 相关的功能。这些功能可以帮助开发者更高效地编写代并提高生产力。 #### 安装通义插件 为了使用通义的相关特性,在 IntelliJ IDEA 中需要先安装对应的插件: 1. 打开 **Settings/Preferences** 对话框 (Ctrl+Alt+S 或 Cmd+, on macOS)。 2. 导航到 `Plugins` 页面[^1]。 3. 在 Marketplace 中搜索 "通义" 并点击安装按钮。 4. 完成安装后重启 IDE 使更改生效。 #### 配置通义服务 成功安装插件之后,还需要配置通义的服务连接信息以便正常使用其提供的各项能力: - 进入设置中的 `Tools | Qwen Coding Assistant` 菜单项[^2]。 - 填写 API Key 和其他必要的认证参数。 - 测试连接以确认配置无误。 #### 使用通义辅助编程 一旦完成上述准备工作,就可以利用通义来进行智能编支持了。具体操作如下所示: ##### 自动补全代片段 当输入部分语句时,IDE 将自动提示可能的后续逻辑,并允许一键插入完整的实现方案[^3]。 ```java // 输入 while 循环条件前半部分... while (!list.isEmpty()) { // 激活建议列表选择合适的循环体内容 } ``` ##### 解释现有代含义 选中某段复杂的表达式或函数调用,右键菜单里会有选项可以请求通义解析这段代的作用以及优化意见。 ##### 生产测试案例 对于已有的业务逻辑模块,借助于通义能够快速生成单元测试框架及初始断言集,减少手动构建的成本。 ```python def test_addition(): result = add(2, 3) assert result == 5, f"Expected 5 but got {result}" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值