У меня проблема с использованием XMLMappable.Вероятно, это ошибка пилота, но я не нашел ее через 3 дня.Я прошел через #xmlmapper вопросы / ответы, но не нашел ничего, что бы с этим справилось.Этот вопрос Как получить доступ к большому дочернему элементу? выглядел многообещающе, но я не думаю, что это та же проблема.Пожалуйста, исправьте меня, если я ошибаюсь.
Я написал XMLParser с использованием XMLMappable.Я построил его с небольшими приращениями, и все прошло хорошо до последнего парсера (Src).Парсер не использует xsd, но предопределенный xsd выглядит следующим образом:
<xs:complexType name="srcCT" mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="w" type="wCT"/>
</xs:choice>
</xs:complexType>
Это означает, что если тег src существует, он может иметь 0 или более innerText, чередующихся с тегом aw, например:
<src> text <w> wtext </w> more text <w> another w tag </w>...</src>
Проблема в том, что результаты парсера повсюду с тем, какие комбинации работают, а какие нет.
Итак, используя пример парсера, я создал свой тест и тестовые данные и добавляюих здесь.Прошу прощения за уродливые линии печати:
import Foundation
import XMLMapper
class TestParser : XMLMappable
{
var nodeName: String!
var entries: [Entry]?
required init ( map: XMLMap )
{
}
func mapping ( map: XMLMap )
{
entries <- map ["entry"]
}
}
class Entry: XMLMappable
{
var nodeName: String!
var id : String?
var lang : String?
var word : W?
var source : Src?
var teststring : String?
required init ( map: XMLMap )
{
}
func mapping ( map: XMLMap )
{
var raw : String?
raw <- map.attributes [ "id" ]
guard raw != nil else { return }
teststring <- map ["testString"]
if teststring != nil
{
print ( "teststring = " + teststring! )
}
lang = String ( raw?.prefix ( 1 ) ?? "q" )
id = String ( (raw?.dropFirst ( 1 ))!)
print ( "************************** \n entry id = " + raw! )
word <- map ["w"]
source <- map ["src"]
print ( "word = " + (word?.word)! )
}
}
class W: XMLMappable
{
var nodeName: String!
var word : String?
var lang : String?
var src : String?
required init ( map: XMLMap )
{
}
func mapping ( map: XMLMap )
{
lang <- map ["_xml:lang"]
src <- map [ "_src"]
word <- map.innerText
}
}
// The P R O B L E M Child
class Src: XMLMappable
{
var nodeName: String!
var srctext : String?
var references : [W]? = [W] ()
required init ( map: XMLMap )
{
}
func mapping ( map: XMLMap )
{
srctext <- map.innerText
if srctext == nil
{
srctext = "???"
}
var word : W?
word <- map ["w"]
guard word != nil else { return }
references?.append ( word! )
print ( "source.w.reference = " + word!.word! )
print ( "source .srctext = " + (srctext!) )
}
}
========== Тестовые данные:
<?xml version="1.0" encoding="utf-8"?>
<lexicon >
<entry id="Q1a">
<testString>Test string Q1</testString>
<w xml:lang="eng">q1</w>
<src>src parser never called for this entry</src>
</entry>
<entry id="Q2">
<w xml:lang="eng">q2</w>
<src>this doesn't (map.innerText returns nil and i change to ???) <w src="Q2a">This works (2a)</w>; never reached </src>
</entry>
<entry id="Q3">
<w xml:lang="eng">q3</w>
<src>map.innerText returns nil <w src="3">This does not work (3)</w>; never reached <w src="Q3a">never reached</w></src>
</entry>
<entry id="Q4">
<w xml:lang="eng">q4</w>
<src>map.innerText returns nil <w src="q4a">This Works: 4a</w>;</src>
</entry>
<entry id="Q5">
<w xml:lang="eng">q5</w>
<src>This works <w src="Q5a">and so does this: 5a</w></src>
</entry>
</lexicon>
==============
и вывод:
teststring = Test string Q1
**************************
entry id = Q1a
word = q1
**************************
entry id = Q2
source.w.reference = This works (2a)
source .srctext = return nil
word = q2
**************************
entry id = Q3
word = q3
**************************
entry id = Q4
source.w.reference = This Works: 4a
source .srctext = return nil
word = q4
**************************
entry id = Q5
source.w.reference = and so does this: 5a
source .srctext = This works
word = q5
Есть две общие проблемы: 1) почему парсер иногда выбирает элементы, а другие нет.2) Как правильно подобрать несколько внутренних текстов и тегов.
Спасибо за помощь в этом.Я действительно надеюсь, что есть решение.
Джозеф