我需要将以下类型的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做到这一点。有人有建议吗?
答案 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>
希望这会有所帮助。