为了账号安全,请及时绑定邮箱和手机立即绑定

Java 使用 SAX 解析读取 XML

Java 使用 SAX 解析读取 XML

慕桂英4014372 2023-08-16 17:39:42
所以我开始使用 xml 和 SAX 解析器,现在我试图弄清楚它是如何工作的,我熟悉 JSON,但这似乎不像 JSON 那样工作。所以这是我正在使用的代码package com.myalbion.gamedataextractor.handlers;import java.io.File;import java.io.IOException;import java.util.List;import java.util.Map;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import com.myalbion.gamedataextractor.Main;import com.myalbion.gamedataextractor.datatables.Language;import com.myalbion.gamedataextractor.datatables.Localized;import com.myalbion.gamedataextractor.datatables.XMLFile;public class LocalizationXMLFileHandler extends DefaultHandler {    private String temp;    Localized localized;    List<Localized> localizedList;    Map<Language, String> tempMap;    /*     * When the parser encounters plain text (not XML elements),     * it calls(this method, which accumulates them in a string buffer     */    public void characters(char[] buffer, int start, int length) {           temp = new String(buffer, start, length);    }    /*     * Every time the parser encounters the beginning of a new element,     * it calls this method, which resets the string buffer     */     public void startElement(String uri, String localName,                  String qName, Attributes attributes) throws SAXException {           temp = "";           if (qName.equalsIgnoreCase("tu")) {               localized = new Localized();               localized.setUniqueName(attributes.getValue("tuid"));           } else if(qName.equalsIgnoreCase("tuv")) {               tempMap.put(Language.getLanguageFromCode(attributes.getValue("xml:lang")), )           }    }    } }我正在尝试将此 xml 文件中的数据提取到包含语言枚举和本地化名称的 tempMap 中。
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

每次点击新的文本节点(包括仅包含空格的文本节点,例如 和 之间的文本节点)时,您都会覆盖文本</seg>缓冲区</tuv>。处理结束标签时需要保存文本缓冲区的内容,处理结束标签seg时将其拾取。tuv

您还应该注意,单个文本节点的内容可以通过对 text() 的一系列调用来提供:解析器可以以任何它喜欢的方式分解它(许多解析器在实体边界上执行此操作)。您需要通过附加到缓冲区来累积内容。

另请注意,XML 区分大小写;在测试元素名称时,您不应该真正忽略大小写。

查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信