如何处理具有重要节点顺序的可选节点的XML文档

时间:2019-01-11 22:05:52

标签: swift xml xmlmapper

我需要将以下类型的XML解析为Swift对象:

<grandparent>
    <parent_1 attr1="a">
        <child_1 attr1="b"/>
        <child_2 attr1="c"/>
    </parent_1>
    <parent_2 attr1="a">
        <child_1 attr1="b"/>
        <child_2 attr1="c"/>
    </parent_2>
    <parent_3 attr1="a">
        <child_1 attr1="b"/>
        <child_2 attr1="c"/>
    </parent_3>
</grandparent>

每个父节点都是可选的,但是无论它们在上面定义的顺序如何,都必须保留在最终的Swift对象中-在这种情况下,该数组具有父1,2,3(如果它们都存在)。

我不清楚如何使用XMLMapper做到这一点。有人有建议吗?

2 个答案:

答案 0 :(得分:0)

您需要定义一个新标签:

<parents>
  <parent id=1>...
  <parent id=2>..,
</parents>

设置一个id属性。

您将获得带有父母子女的父母元素。

按ID对数组进行排序:

array.sort(by: { $0.id < $1.id })

答案 1 :(得分:0)

1.5.2版本XMLMapper起,您可以使用nodesOrder的{​​{1}}属性保留元素的顺序。请参阅自述文件here

因此,您可以像这样映射XML:

XMLMap

您只需保留普通映射即可完成以下操作:

class Grandparent: XMLMappable {
    var nodeName: String!

    var parent_1: Parent?
    var parent_2: Parent?
    var parent_3: Parent?
    var nodesOrder: [String]?

    required init?(map: XMLMap) {}

    func mapping(map: XMLMap) {
        parent_1 <- map["parent_1"]
        parent_2 <- map["parent_2"]
        parent_3 <- map["parent_3"]
        nodesOrder <- map.nodesOrder
    }
}

class Parent: XMLMappable {
    var nodeName: String!

    var attr1: String?
    var child_1Attr1: String?
    var child_2Attr1: String?

    required init?(map: XMLMap) {}

    func mapping(map: XMLMap) {
        attr1 <- map.attributes["attr1"]
        child_1Attr1 <- map.attributes["child_1.attr1"]
        child_2Attr1 <- map.attributes["child_2.attr1"]
    }
}

或者您可以手动更改它:

let grandparent = Grandparent(XMLString: xmlString)

如果您有许多父元素,并且可以更改提供的XML,则应该使用let grandparent = Grandparent(XMLString: xmlString) grandparent.nodesOrder = ["parent_1", "parent_3", "parent_2"] 元素数组,而不要使用<parent><parent_1><parent_2> < / p>

<parent_3>

在这种情况下,您可以将其映射到<grandparent> <parent attr1="a"> <child_1 attr1="b"/> <child_2 attr1="c"/> </parent> <parent attr1="a"> <child_1 attr1="b"/> <child_2 attr1="c"/> </parent> <parent attr1="a"> <child_1 attr1="b"/> <child_2 attr1="c"/> </parent> </grandparent> 中,而不必担心订购:

Array<Parent>

希望这会有所帮助。