gpt4 book ai didi

java - SAX 解析 - 将嵌套标签映射到主标签

转载 作者:行者123 更新时间:2023-12-01 09:06:34 25 4
gpt4 key购买 nike

我想对大型 XML 文件使用 SAX 解析器。处理程序如下所示:

DefaultHandler handler = new DefaultHandler() {
String temp;
HashSet < String > xml_Elements = new LinkedHashSet < String > ();
HashMap < String, Boolean > xml_Tags = new LinkedHashMap < String, Boolean > ();
HashMap < String, ArrayList < String >> tags_Value = new LinkedHashMap < String, ArrayList < String >> ();

// ### startElement #######
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
xml_Elements.add(qName);


for (String tag: xml_Elements) {
if (qName == tag) {
xml_Tags.put(qName, true);
}
}
}

// ########### Characters ###########
public void characters(char ch[], int start, int length) throws SAXException {

temp = new String(ch, start, length);
}

// ########### endElement ############
public void endElement(String uri, String localName,
String qName) throws SAXException {

if (xml_Tags.get(qName) == true) {
if (tags_Value.containsKey(qName)) {
tags_Value.get(qName).add(temp);
tags_Value.put(qName, tags_Value.get(qName));
}
else {
ArrayList < String > tempList = new ArrayList < String > ();
tempList.add(temp);
//tags_Value.put(qName, new ArrayList<String>());
tags_Value.put(qName, tempList);
}
//documentWriter.write(qName + ":" + temp + "\t");
for (String a: tags_Value.keySet()) {
try {
documentWriter.write(tags_Value.get(a) + "\t");
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
xml_Tags.put(qName, false);
}
tags_Value.clear();
}
};

我的 XML 是这样的:

<TermInfo>
<A>1/f noise</A>
<B>Random noise</B>
<C>Accepted</C>
<D>Flicker noise</D>
<F>Pink noise</F>
<I>1-f</I>
<I>1/f</I>
<I>1/f noise</I>
<I>1:f</I>
<I>flicker noise</I>
<I>noise</I>
<I>pink noise</I>
<ID>1</ID>
</TermInfo>
<TermInfo>
<A>3D printing</A>
<B>Materials fabrication</B>
<C>Accepted</C>
<D>3d printing</D>
<F>2</F>
<I>three dimension*</I>
<I>three-dimension*</I>
<I>3d</I>
<I>3-d</I>
<I>3d*</I>
</TermInfo>

我想将所有嵌套标签聚集到标签 A 下。即,对于每个 A,其 B、C、D 和 I 一起等等。但是使用上述处理程序,输出类似于 A-B-C-D-I-I-etc。我可以为每个 A 创建一个对象并向其中添加其他元素吗?我怎样才能包含这个?

最佳答案

我认为这符合您的要求。它创建一个 HashMap 对象列表。每次启动 TermInfo 时,都会创建一个新的 HashMap。 TermInfo 中的每个 endElement 都会将一个值放入 M​​ap 中。当 endElement 为 TermInfo 时,它将 fieldMap 设置为 null,因此不会添加中间标签。 “TermInfo”代表您描述中的 A。

public class TestHandler extends DefaultHandler
{
Map<String, String> fieldMap = null;
List<Map<String, String>> tags_Value = new ArrayList<Map<String, String>>();
String temp;

// ###startElement#######
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
if (localName.equals("TermInfo")) // A
{
fieldMap = new HashMap<String, String>();
tags_Value.add(fieldMap);
}
}

// ###########characters###########
public void characters(char ch[], int start, int length)
throws SAXException
{
temp = new String(ch, start, length);
}

// ###########endElement############
public void endElement(String uri, String localName, String qName)
throws SAXException
{
if (fieldMap != null)
{
if (!localName.equals("TermInfo")) // A
{
fieldMap.put(localName, temp);
}
else
{
// END of TermInfo
fieldMap = null;
}
}
}

关于java - SAX 解析 - 将嵌套标签映射到主标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41222047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com