解析XML文档iOS

时间:2014-03-14 20:59:30

标签: ios objective-c xml parsing nsxmlparser

我必须解析这个文档,我打算使用NSXMLparser,但唯一的问题是我不知道如何获取我想要的信息。我不知道如何浏览每个标签,我看到了简单的例子,但是当我尝试使用他们的方法时,我得到了我不想要的随机标签和信息。有人可以解释如何从复杂的XML结构中获取某些信息吗? 谢谢!

 <kml xmlns:ns3="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:ns2="http://www.w3.org/2005/Atom"
    xmlns="http://www.opengis.net/kml/2.2">
    <Document>
            <description>Available CAR2GO Vehicles</description>
            <Style id="car2go">
                    <IconStyle>
                            <Icon>
                                    <href>http://www.car2go.com/common/images/openapi/marker_car2go.png
                                    </href>
                            </Icon>
                            <hotSpot y="0.0" x="0.0" />
                    </IconStyle>
            </Style>
            <Style id="car2go_ed">
                    <IconStyle>
                            <Icon>
                                    <href>http://www.car2go.com/common/images/openapi/marker_car2go_ed.png
                                    </href>
                            </Icon>
                            <hotSpot y="0.0" x="0.0" />
                    </IconStyle>
            </Style>
            <Placemark>
                    <name>UL-C5887</name>
                    <description>Sudetenweg, 89075 Ulm<br/>Fuel
                            24<br/>Interior GOOD<br/>Exterior GOOD
                    </description>
                    <styleUrl>#car2go_ed</styleUrl>
                    <ExtendedData>
                            <Data name="fuel">
                                    <value>24</value>
                            </Data>
                            <Data name="interior">
                                    <value>GOOD</value>
                            </Data>
                            <Data name="exterior">
                                    <value>GOOD</value>
                            </Data>
                            <Data name="vin">
                                    <value>WME4513001K154655</value>
                            </Data>
                            <Data name="engineType">
                                    <value>ED</value>
                            </Data>
                            <Data name="charging">
                                    <value>true</value>
                            </Data>
                    </ExtendedData>
                    <Point>
                            <coordinates>10.029,48.4362,0</coordinates>
                    </Point>
            </Placemark>
            <Placemark>
                    <name>UL-C5889</name>
                    <description>Heilmeyersteige, 89075 Ulm<br/>Fuel
                            58<br/>Interior GOOD<br/>Exterior GOOD
                    </description>
                    <styleUrl>#car2go</styleUrl>
                    <ExtendedData>
                            <Data name="fuel">
                                    <value>58</value>
                            </Data>
                            <Data name="interior">
                                    <value>GOOD</value>
                            </Data>
                            <Data name="exterior">
                                    <value>GOOD</value>
                            </Data>
                            <Data name="vin">
                                    <value>WME4513001K154655</value>
                            </Data>
                            <Data name="engineType">
                                    <value>CE</value>
                            </Data>
                    </ExtendedData>
                    <Point>
                            <coordinates>9.947235,48.410497,0</coordinates>
                    </Point>
            </Placemark>
    </Document>

3 个答案:

答案 0 :(得分:0)

我建议您查看Apple自己的示例代码所展示的策略:

https://developer.apple.com/library/ios/samplecode/SeismicXML/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007323

实际的解析代码在这里:

https://developer.apple.com/library/ios/samplecode/SeismicXML/Listings/SeismicXML_APLParseOperation_m.html#//apple_ref/doc/uid/DTS40007323-SeismicXML_APLParseOperation_m-DontLinkElementID_11

所有工作都由解析器的委托(即此对象self)完成。请特别注意didStartElement:...如何根据刚刚遇到的元素类型做出选择。

我还应该提一下,还有另一种策略,即代理人做出这些选择,而不是在不同的委托中重新分配解析器。在这里,我开发了该策略的一般版本,并展示了如何使其适应特定的解析情况:http://www.apeth.com/iOSBook/ch36.html#_xml

答案 1 :(得分:0)

  

我得到随机标签和我不想要的信息

使用NSXMLParser,您无需浏览XML。相反,您为解析器创建一个委托,每次解析器遇到某些东西时都会收到消息 - 标记,值等。您的委托需要监视它感兴趣的标记和值,并对您的应用做任何有意义的事情当那些人到达时因此,您看到的标签不是随机的,它们只是您按照它们在文件中出现的顺序解析的文件中的标签。

  

有人可以解释如何从复杂的XML结构中获取某些信息吗?

通常,你的解析器委托有点像状态机,它跟踪它正在解析的标签,它看到的数据等等。这可能比你想要的更多,在这种情况下你可能想要查看除NSXMLParser之外的其他XML解析选项。 TouchXML是一个受欢迎的库,因为它为您解析文件,然后让您使用Xquery查看数据。

答案 2 :(得分:0)

我强烈建议你不要重新发明轮子并使用高级别的第三方图书馆,这将使你的生活更轻松。 AFMetworking成名的@mattt拥有一个出色的XML解析库,名为Ono