2

XMLMappable の使用に問題があります。これはおそらくパイロット エラーですが、3 日経ってもまだ見つかりません。#xmlmapper の質問と回答を確認しましたが、これに関するものは見つかりませんでした。この質問孫要素にアクセスするにはどうすればよいですか? 有望に見えましたが、同じ問題ではないと思います。私が間違っている場合は、私を修正してください。

XMLMappable を使用して XMLParser を作成しました。私はそれを少しずつ構築しましたが、最後のパーサー (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 タグが存在する場合、次のように、aw タグと交互に 0 個以上の innerText を持つことができることを意味します。

    <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

一般的な問題が 2 つあります。1) パーサーが要素を取得する場合としない場合がある理由。2) 複数の内部テキストとタグを正しく取得する方法。

ご協力いただきありがとうございます。解決策があることを本当に願っています。

ジョセフ

4

1 に答える 1