如何在Swift中使用NSXMLParser解析具有2个根元素的xml文档?
我正在尝试使用Swift中的NSXMLParser解析这个XML文档。 我的问题是我能够解析属性元素,比如如何在Swift中使用NSXMLParser解析具有2个根元素的xml文档?,xml,swift,element,nsxmlparser,Xml,Swift,Element,Nsxmlparser,我正在尝试使用Swift中的NSXMLParser解析这个XML文档。 我的问题是我能够解析属性元素,比如 PointsButoir,Difficulte ,etc. 但是当到达困难元素和属性的结束标记时,发生了一个错误。 以下是我编写代码的方式: func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, a
PointsButoir,Difficulte ,etc.
但是当到达困难
元素和属性
的结束标记时,发生了一个错误。
以下是我编写代码的方式:
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if (elementName == "Proprietes"){
isProp = true;
}
if (elementName == "arbreRenduINF2990"){
isArbre = true;
}
switch elementName {
case "xml": break
case "Proprietes" :break
case "arbreRenduINF2990" :
print("arbre")
case "PointsButoir":
let ptsButoir = attributeDict["Nombre"] as String!
prop.ptsButoir = Int(ptsButoir)!
case "PointsTriangulaire" :
let ptsTriangulaires = attributeDict["Nombre"] as String!
prop.ptsTri = Int(ptsTriangulaires)!
case "PointsCible" :
let ptsCible = attributeDict["Nombre"] as String!
prop.ptsCible = Int(ptsCible)!
case "PointsVictoire" :
let ptsVic = attributeDict["Nombre"] as String!
prop.ptsVictoire = Int(ptsVic)!
case "PointsBilleGratuite" :
let ptsBille = attributeDict["Nombre"] as String!
prop.ptsBilleGratuite = Int(ptsBille)!
case "Difficulte" :
let diff = attributeDict["Nombre"] as String!
prop.difficulte = Int(diff)!
case "table" :
let nbEnfants = attributeDict["nbEnfants"] as String!
let nbreNoeuds = Int(nbEnfants)!
case "boost": break
case "trou":
print("trou")
default :
let posX = attributeDict["posX"] as String!
if let n = NSNumberFormatter().numberFromString(posX) {
attObjets.posX = CGFloat(n)
}
let posY = attributeDict["posY"] as String!
if let n = NSNumberFormatter().numberFromString(posY) {
attObjets.posY = CGFloat(n)
}
let posZ = attributeDict["posZ"] as String!
if let n = NSNumberFormatter().numberFromString(posZ) {
attObjets.posZ = CGFloat(n)
}
let angleX = attributeDict["angleX"] as String!
if let n = NSNumberFormatter().numberFromString(angleX) {
attObjets.angleX = CGFloat(n)
}
let angleY = attributeDict["angleY"] as String!
if let n = NSNumberFormatter().numberFromString(angleY) {
attObjets.angleY = CGFloat(n)
}
let angleZ = attributeDict["angleZ"] as String!
if let n = NSNumberFormatter().numberFromString(angleZ) {
attObjets.angleZ = CGFloat(n)
}
let scaleX = attributeDict["scaleX"] as String!
if let n = NSNumberFormatter().numberFromString(scaleX) {
attObjets.scaleX = CGFloat(n)
}
let scaleY = attributeDict["scaleY"] as String!
if let n = NSNumberFormatter().numberFromString(scaleY) {
attObjets.scaleY = CGFloat(n)
}
let scaleZ = attributeDict["scaleZ"] as String!
if let n = NSNumberFormatter().numberFromString(scaleZ) {
attObjets.scaleZ = CGFloat(n)
}
let objetAcharger = monObjet(name: elementName,attributs: attObjets)
nodesAcharger.append(objetAcharger)
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?){
if (isProp){
}
if(isArbre){
}
}
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
print("Erreur dans le parseur XML")
}
在我看来,它似乎无法解析下一个根元素(arbreRenduINF2990),但我找不到问题格式良好的XML不能包含多个根元素。如果你想解析它,你必须把它分成单独的流,每个流包含一个根元素。谢谢你的回复,但我只需要处理一个xml文件。我不知道如何分割,你有一个XML文件,但你可以对它进行预处理,然后在内存中将它分割成几个不同的部分。你没有一个XML文件。您有一个文本文件。正如@JimGarrison所说,XML不能有多个根元素。您有两种选择,这两种选择都要求您将文件视为文本,而不是XML,因为它不是XML:(1)将两个根元素拆分为两个XML文档(正如Jim建议的那样),或者(2)用单个根元素包装两个根元素。如果您的“XML”在其他方面都很好,那么在采取上述两种方法之一之后,您将能够对数据使用XML解析器和工具。要么在这里粘贴所有内容,要么使用Pastebin。记住清理所有敏感信息。