Rob*_*uch 5 java xml parsing sax
我从REST服务接收XML文档,该文档应使用SAX进行解析.请参阅以下由XSD生成的示例.
设置解析器不是问题.我的主要问题是实际处理startElement(),endElement()方法等.我不明白如何提取我需要的项目并存储它们,因为它们有点"嵌套".
所述ConnectionList可一次或两次出现,并且可以包含任意数量的Connection其-in了转向有关于一个连接的信息的元素.基本上,我需要一个与他们的所有连接的列表Date,Transfers和Time.我是否必须为每个元素创建一个类?
据我所知,我不知何故需要做以下事情:如果解析器遇到...
ConnectionList:创建新ConnectionList对象并将其放入ConnectionLists 列表中Connection:创建一个新的Connection对象并将其放入Connections列表中Date,Transfers,Time(仅当父是Duration):在当前存储器的节点值Connection对象我真的很感激任何帮助,暗示,想法,片段我是如何实现这一目标的.
谢谢 :-)
罗伯特
<?xml version="1.0" encoding="UTF-8"?>
<ResC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Err code="r5E5a1Wm" text="tk-gWYbw" level="E"/>
<Err code="takVDd34" text="XtvyjmjPuscK" level="E"/>
<Err code="hQ1-:aDQ" text="YWc5qtY.gkwCeJW2S" level="E"/>
<ConRes dir="R">
<Err code="ZfwPC:tj" text="RKKFuLXoM0oOfp3a" level="E"/>
<Err code="bhDjSJPa" text="BJoHuOMdwzhcddW" level="E"/>
<Err code="CX-NhK9r" text="j55qy-WiNPXu" level="E"/>
<ConResCtxt b="1" f="1">0815</ConResCtxt>
<ConnectionList type="IV">
<Err code="WI3WX.jo" text="rK3H5jwa-Zfen3" level="E"/>
<Connection id="ID000">
<Overview>
<Date>b3lcM_Yiyq7dqL9</Date>
<Departure>
<BasicStop type="NORMAL" index="-1086549314">
<Address externalId="t.EdKe93xkqFqLwPzgd-4vHSJemy8"
externalStationNr="1332105793" name="fdREYJPu83WV503V8szdCX"
x="951177990" y="-1579782776" z="1807457957" type="WGS84"/>
</BasicStop>
</Departure>
<Arrival>
<BasicStop type="NORMAL" index="1897526979">
<Address externalId="l7h_GTUit6fv" externalStationNr="-1670310329"
name="WJznDTzkTvyET51pfr7X" x="-1738098662" y="-170353174"
z="-475585957" type="WGS84"/>
</BasicStop>
</Arrival>
<Transfers>dZbgZfDH8j1hb1i</Transfers>
<Duration>
<Time>00d00:18:00</Time>
</Duration>
<ServiceDays> </ServiceDays>
<Products>
<Product cat="qmrN2dShHJp"/>
<Product cat="Hg"/>
<Product cat="nurxhdl3w.P0x7FRv2J3UoF"/>
</Products>
<ContextURL url="http://FzgEqiVC/"/>
</Overview>
</Connection>
<Connection id="ID004">
<Overview>
<Date>W5a47DRkc7XDZjhwq_s5Un.</Date>
<Departure>
<BasicStop type="NORMAL" index="-1014429844">
<Address externalId="RMnzjEFOTTdM1oaAUw" externalStationNr="1429101638"
name="HF-1" x="1005198487" y="570832676" z="975615566" type="WGS84"
/>
</BasicStop>
</Departure>
<Arrival>
<BasicStop type="NORMAL" index="-58308182">
<Address externalId="rVdwdQvAukfj2QcA7b3OSdGOyW"
externalStationNr="1142334006" name="g" x="-1791416159"
y="-541300941" z="478129823" type="WGS84"/>
</BasicStop>
</Arrival>
<Transfers>GG56XN6zgiJF804mE_N4o</Transfers>
<Duration> </Duration>
<ServiceDays> </ServiceDays>
<Products>
<Product cat="fs_Oyoy9NYBai-qaxbty6j9Y7r1St"/>
<Product cat="P2CbaSGpC"/>
<Product cat="CGZrqSIDM6M4kUlb8_xZ8jRlH4c"/>
</Products>
<ContextURL url="http://JkRhuXtu/"/>
</Overview>
</Connection>
</ConnectionList>
<ConnectionList type="IV">
<Err code="0lFWRY2X" text="KLmdczFRhV" level="E"/>
<Connection id="ID012">
<Overview>
<Date>t8mn634zjCZsRPyxj_e_-UYMH</Date>
<Departure>
<BasicStop type="NORMAL" index="-2095085423">
<Address externalId="ftKAFG-Uk7x" externalStationNr="1390920810"
name="JQrQXOQbm.FLaCMeSiTYjT" x="1970142849" y="-655980297"
z="2102464970" type="WGS84"/>
</BasicStop>
</Departure>
<Arrival>
<BasicStop type="NORMAL" index="1552118247">
<Address externalId="qcBpeuPDRzvSt1o" externalStationNr="-1133118359"
name="AJiJOB1t" x="-1422533132" y="-1158953133" z="484831466"
type="WGS84"/>
</BasicStop>
</Arrival>
<Transfers>D0MiUwW9nuuM_uykvawg2C07pwHL</Transfers>
<Duration> </Duration>
<ServiceDays> </ServiceDays>
<Products>
<Product cat="LpGOZbLDbJm"/>
<Product cat="JIv-szQVX2icPb"/>
<Product cat="Q7-pthWoOT"/>
</Products>
<ContextURL url="http://zGWgivvi/"/>
</Overview>
<IList>
<I header="ze4Wt3hVD-DvjujY6QKae" text="lVwB4RxAHcYq3.F"
uriCustom="iVjQJCoU1MVOv2Z9lwarP"/>
<I header="z-i.au59soMzXLZCbV" text="PoTP" uriCustom="ksrbwEH6scNR"/>
<I header="N" text="jHDA4" uriCustom="ub95811lMIa_495ZbPOuNWL0rRWh"/>
</IList>
<CommentList>
<Comment id="ID013">
<Text lang="EN"> </Text>
<Text lang="FR"> </Text>
<Text lang="PL"> </Text>
</Comment>
<Comment id="ID014">
<Text lang="DK"> </Text>
<Text lang="IT"> </Text>
<Text lang="IT"> </Text>
</Comment>
<Comment id="ID015">
<Text lang="MACRO"> </Text>
<Text lang="IT"> </Text>
<Text lang="EN"> </Text>
</Comment>
</CommentList>
</Connection>
</ConnectionList>
</ConRes>
</ResC>
Run Code Online (Sandbox Code Playgroud)
我发现(到目前为止)使用SAX解析XML的最好方法是在相关的回调中使用堆栈和条件语句.这是一篇描述它的文章,以及我对它的总结:
基本前提是,在解析文档时,您可以创建对象来存储已分析的数据,随时将它们推送到堆栈中,在堆栈顶部窥视以将数据添加到当前元素,并在每个元素的末尾元素将其从堆栈中弹出并将其存储在父级中.
结果是,您首先解析元素树的深度,然后在每个分支的末尾将其回滚到父级,直到您留下包含所有已解析数据的单个对象(例如您的ConnectionList)为止要使用的.实质上,您最终会得到一系列镜像原始XML结构的对象
这意味着您需要一些数据对象,这些数据对象可以将数据存储在与XML相同的结构中.复杂元素通常会成为类,而简单元素通常是类中的属性.根元素通常由某种列表表示.
首先,创建一个堆栈对象,以便在解析数据时保存数据.
然后,在每个元素的开头,使用localName.equals()方法确定它的类型,创建适当类的实例,并将其推入堆栈.如果元素是一个简单元素,您可能会将其作为表示父元素的类中的属性进行建模,并且您将需要一系列标志来告诉解析器是否遇到这样的元素以及它是什么元素因此它可以在方法中处理characters().
使用该characters()方法读取实际数据,并再次使用条件逻辑根据标志的值确定如何处理数据.基本上,您可以查看堆栈的顶部并使用适当的方法将数据写入对象,并在必要时从文本进行转换.
在每个元素的末尾,弹出堆栈的顶部并localName.equals()再次使用以确定如何将它存储在对象之前(例如,需要调用哪个setter方法)
当您到达文档的末尾时,您应该已捕获文档中的所有数据.
您的SAX事件处理程序应该充当状态机.你的结构很深,所以状态机会有点复杂; 但这是基本方法:
所有变量都是成员变量.
遇到startElement事件时,实例化表示该元素的对象,然后将该对象放在堆栈上(或设置一个标志,指示您正在使用的值).
遇到文本事件时,请阅读文本并根据您在上一步中设置的标志设置适当的值.
遇到endElement事件时,将当前对象从堆栈中拉出并调用现在位于堆栈顶部的对象上的setter.
当你耗尽文档时,你应该只有一个对象留在堆栈上,代表你读过的所有东西.
| 归档时间: |
|
| 查看次数: |
3934 次 |
| 最近记录: |