Разбор XML документов iOS

Мне нужно разобрать этот документ, и я планирую использовать 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 ответа

Я получаю случайные теги и информацию, которую не хочу

С NSXMLParser вы не перемещаетесь по XML. Вместо этого вы создаете делегата для синтаксического анализатора, который получает сообщения каждый раз, когда синтаксический анализатор встречает что-либо - тег, значение и т. Д. Ваш делегат должен отслеживать теги и значения, которые ему интересны, и делать все, что имеет смысл для вашего приложения. когда те прибудут. Итак, теги, которые вы видите, не случайны, это просто теги из файла, который вы анализируете, в том порядке, в котором они появляются в файле.

Может кто-нибудь объяснить, как получить определенную информацию из сложной структуры XML, такой как эта?

Как правило, ваш делегат синтаксического анализатора будет немного похож на конечный автомат, который отслеживает, какой тег он анализирует, какие данные он видит и т. Д. Это может быть больше, чем нужно, и в этом случае вы можете захотеть посмотреть на другие Варианты разбора XML, чем NSXMLParser, TouchXML - это одна из популярных библиотек, поскольку она анализирует файл для вас, а затем позволяет просматривать данные с помощью Xquery.

Я настоятельно рекомендую вам не изобретать велосипед и использовать стороннюю библиотеку высокого уровня, которая сделает вашу жизнь намного проще. @mattt известной AFNetworking среди других имеет превосходную библиотеку XML-разбора под названием Ono.

Я предлагаю вам изучить стратегию, продемонстрированную собственным примером кода Apple, здесь:

https://developer.apple.com/library/ios/samplecode/SeismicXML/Introduction/Intro.html

Фактический код синтаксического анализа здесь:

https://developer.apple.com/library/ios/samplecode/SeismicXML/Listings/SeismicXML_APLParseOperation_m.html

Вся работа выполняется делегатом синтаксического анализатора (который является этим объектом, self). Обратите внимание, в частности, как didStartElement:... делает выбор в зависимости от того, какой элемент только что встречался.

Я должен также упомянуть, что существует другая стратегия, где вместо того, чтобы делегат делал эти выборы, вы продолжаете переопределять синтаксический анализатор на другого делегата. Здесь я разрабатываю общую версию этой стратегии и показываю, как адаптировать ее к конкретной ситуации анализа: http://www.apeth.com/iOSBook/ch36.html

Другие вопросы по тегам