使用 SAXParser 读取 XML
Reading an XML using SAXParser
我想读这样一个文件:
<level1 a="1" b="2" c="3">
<level2 a2="1" b2="2" c2="3">
<level3 a3="1" b3="2" c3="3">
<level4 a4="1" b4="2" c4="3">
</level3>
</level2>
<level2a a2a="1" b2a="2" c2a="3">
<level3a>
<level3 id="0"/>
<level3 id="2"/>
<level3 id="7"/>
<level3 id="11"/>
</level3a>
</level2a>
</level1>
注: level3
实际上在不同的上下文中使用了两次
我想在 Java 中使用 SAXParser
的地方混淆了一些伪代码:
create new parser
loop to get tags
if tag is level 1
get its properties(a b and c)
save the values of them into level1_a,level1_b,level1_c
if tag is level 2
...
if ..
...
end loop
done
但是我从来没有用过它,我不清楚它是如何工作的,你能帮我吗?
使用 SAX 解析,您需要自己处理上下文。你这里的问题是区分 level3
节点低于 level2
或低于 level3a
。最好的方法是在解码时处理一个堆栈,你当前所在的节点是什么:
- 在 startElement
之后将节点(名称?)压入堆栈
- 在 endElement 之后弹出顶部节点(名称?)。
在您的伪代码中,您的 "loop to get tags" 实际上是您注册到 SAXParser 的 SAX 回调。每次启动它时,您还可以将节点名称推送到堆栈中。然后当读取一个level3
节点时,你只需要读取栈顶节点的名称就可以知道是否需要读取id
或者三元组a3
b3
c3
当前节点中的属性。
我想读这样一个文件:
<level1 a="1" b="2" c="3">
<level2 a2="1" b2="2" c2="3">
<level3 a3="1" b3="2" c3="3">
<level4 a4="1" b4="2" c4="3">
</level3>
</level2>
<level2a a2a="1" b2a="2" c2a="3">
<level3a>
<level3 id="0"/>
<level3 id="2"/>
<level3 id="7"/>
<level3 id="11"/>
</level3a>
</level2a>
</level1>
注: level3
实际上在不同的上下文中使用了两次
我想在 Java 中使用 SAXParser
的地方混淆了一些伪代码:
create new parser
loop to get tags
if tag is level 1
get its properties(a b and c)
save the values of them into level1_a,level1_b,level1_c
if tag is level 2
...
if ..
...
end loop
done
但是我从来没有用过它,我不清楚它是如何工作的,你能帮我吗?
使用 SAX 解析,您需要自己处理上下文。你这里的问题是区分 level3
节点低于 level2
或低于 level3a
。最好的方法是在解码时处理一个堆栈,你当前所在的节点是什么:
- 在 startElement 之后将节点(名称?)压入堆栈
- 在 endElement 之后弹出顶部节点(名称?)。
在您的伪代码中,您的 "loop to get tags" 实际上是您注册到 SAXParser 的 SAX 回调。每次启动它时,您还可以将节点名称推送到堆栈中。然后当读取一个level3
节点时,你只需要读取栈顶节点的名称就可以知道是否需要读取id
或者三元组a3
b3
c3
当前节点中的属性。