Swift XML属性解析 [英] Swift XML attribute parsing
问题描述
我在Swift中无法解析XML.我想使用AttributeDict
,但是我有很多属性可以使用.所以我用Dictionary
.但这没用
我在此页面中使用代码:
I have problem with XML parsing in Swift. I woul like to use AttributeDict
but i have many attributes to use it. So i use Dictionary
. But it's not working,
And i use code in this page:
,但仍然无法正常工作.告诉我你是否知道 我的XML数据:
but it's still not working. Tell me if you know My XML Data:
<root>
<day1><day1 p1.1="-" pk1.1="-" s1.1="" a1.1="-" p1.2="-" pk1.2="-" s1.2="" a1.2="-"
p1.3="Начертательная геометрия и компьютерная графика" pk1.3="НГиКГ" s1.3="Оспанова З. К."
a1.3="127 ГМК" p1.4="Начертательная геометрия и компьютерная графика" pk1.4="НГиКГ"
s1.4="Оспанова З. К." a1.4="127 ГМК" p1.5="Физика" pk1.5="Физика" s1.5="Сарсембаева Б. Д."
a1.5="913 ГУК" p1.6="Физика" pk1.6="Физика" s1.6="Сарсембаева Б. Д." a1.6="1035 с ГУК"
p1.7="Физика" pk1.7="Физика" s1.7="Сарсембаева Б. Д." a1.7="913а ГУК" p1.8="Физика"
pk1.8="Физика" s1.8="Сарсембаева Б. Д." a1.8="913а ГУК" p1.9="Физическая культура"
pk1.9="ФизКульт" s1.9="Акмалиев А. Ж." a1.9=" -" p1.10="Физическая культура" pk1.10="ФизКульт"
s1.10="Акмалиев А. Ж." a1.10=" -" p1.11="-" pk1.11="-" s1.11="" a1.11="-" p1.12="-" pk1.12="-"
s1.12="" a1.12="-" p2.1="-" pk2.1="-" s2.1="" a2.1="-" p2.2="Политология" pk2.2="Полит-ия"
s2.2="Анапияева Г. Б." a2.2="705 ГУК" p2.3="Физика" pk2.3="Физика" s2.3="Оспанов К. М."
a2.3="713 ГУК" p2.4="Физика" pk2.4="Физика" s2.4="Оспанов К. М." a2.4="713 ГУК"
p2.5="Начертательная геометрия и компьютерная графика" pk2.5="НГиКГ" s2.5="Оспанова З. К."
a2.5="1035в ГУК" p2.6="Начертательная геометрия и компьютерная графика" pk2.6="НГиКГ"
s2.6="Оспанова З. К." a2.6="1035в ГУК" p2.7="Физическая культура" pk2.7="ФизКульт" s2.7="Акмалиев А. Ж."
a2.7=" -" p2.8="Физическая культура" pk2.8="ФизКульт" s2.8="Акмалиев А. Ж." a2.8=" -" p2.9="-"
pk2.9="-" s2.9="" a2.9="-" p2.10="-" pk2.10="-" s2.10="" a2.10="-" p2.11="-" pk2.11="-" s2.11="" a2.11="-"
p2.12="-" pk2.12="-" s2.12="" a2.12="-" p3.1="-" pk3.1="-" s3.1="" a3.1="-" p3.2="-" pk3.2="-" s3.2="" a3.2="-"
p3.3="Математика II" pk3.3="Матем.II" s3.3="Акимжанова Ш. А." a3.3="713 ГУК" p3.4="Математика II"
pk3.4="Матем.II" s3.4="Акимжанова Ш. А." a3.4="713 ГУК" p3.5="Начертательная геометрия и компьютерная графика"
pk3.5="НГиКГ" s3.5="Иисова А. М." a3.5="533 ГУК" p3.6="Эдвайзер" pk3.6="ЭД" s3.6="Тирижанова М. Б."
a3.6="517 ВК" p3.7="Начертательная геометрия и компьютерная графика" pk3.7="НГиКГ" s3.7="Курманалиева Ш. М."
a3.7="805 ГУК" p3.8="Начертательная геометрия и компьютерная графика" pk3.8="НГиКГ" s3.8="Курманалиева Ш. М."
a3.8="805 ГУК" p3.9="Начертательная геометрия и компьютерная графика" pk3.9="НГиКГ" s3.9="Курманалиева Ш. М."
a3.9="708 ГУК" p3.10="Начертательная геометрия и компьютерная графика" pk3.10="НГиКГ"
s3.10="Курманалиева Ш. М." a3.10="708 ГУК" p3.11="-" pk3.11="-" s3.11="" a3.11="-" p3.12="-"
pk3.12="-" s3.12="" a3.12="-"></day1>
</day1>
</root>
我无法正常工作的代码:
And my not working Code:
@IBOutlet weak var tableView: UITableView!
func parser = NSXMLParser()
var schedule = NSDictionary()
var elements = NSMutableDictionary()
var element = NSString()
func beginParsing()
{
parser = NSXMLParser(contentsOfURL: NSURL(string: "SomeUrl")!)!
parser.delegate = self
parser.parse()
}
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!)
{
element = elementName
if (elementName as NSString).isEqualToString("day1")
{
//name of subject
schedule = [p1.1="-", pk1.1="", s1.1="", a1.1="", p1.2="", pk1.2="",
s1.2="", a1.2="", p1.3="", pk1.3="", s1.3="",
a1.3="", p1.4="", pk1.4="",
s1.4="", a1.4="", p1.5="", pk1.5="", s1.5="",
a1.5="", p1.6="", pk1.6="", s1.6="", a1.6="",
p1.7="", pk1.7="", s1.7="", a1.7="", p1.8="",
pk1.8="", s1.8="", a1.8="", p1.9="",
pk1.9="", s1.9="", a1.9="", p1.10="", pk1.10="",
s1.10="", a1.10=""]
elements = NSMutableDictionary()
elements = [:]
}
}
func parser(parser: NSXMLParser!, foundCharacters string: NSString!)
{
if element.isEqualToString("day1") {
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName: String!, attributes: [NSObject : AnyObject]!) {
element = elementName
if (elementName as NSString).isEqual("day1") {
}
}
}
}
func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!)
{
if (elementName as NSString).isEqualToString("day1") {
print(schedule)
}`
我不创建此XML数据,这些XML数据使我上大学
And i don't create this XML data, this XML data give me my university
推荐答案
一些观察结果:
-
您的
didStartElement
应该只查看attributeDict
以获得元素的属性.
Your
didStartElement
should simply look atattributeDict
to get the attributes for an element.
在这种情况下,您不需要foundCharacters
方法,因为您只解析元素标签,而不解析打开和关闭标签之间的任何内容.
You don't need a foundCharacters
method in this case, because you're only parsing elements tags, and not parsing anything between the open and close tags.
如果您甚至需要foundCharacters
方法,也不应在其中实现私有的didStartElement
.
The foundCharacters
method, if you even needed it, shouldn't have a private didStartElement
implemented within it.
您的示例中的唯一技巧是您的XML与嵌套的day1
标记非常混乱.我真的建议将XML更改为有意义的内容.
The only trick in your example is that you have very confusing XML with nested day1
tags. I'd really suggest changing the XML to something that makes sense.
但是,如果遇到这种情况,一个相当灵活的解决方案是保留一堆元素名称(实现为简单数组elementNames
),将elementName
推入didStartElement
中的堆栈(通过加到elementNames
数组的末尾),然后在didEndElement
中弹出一个(通过调用removeLast
).因此,例如,当您击中XML内部的day1
标记时,elementNames
的数组将为["root", "day1", "day1"]
.
But, if you're stuck with this, one fairly flexible solution is to keep a stack of element names (implemented as simple array, elementNames
), push an elementName
onto the stack in didStartElement
(by adding to the end of the array of elementNames
) and popping one off in didEndElement
(by calling removeLast
). So, for example, by the time you hit the inner day1
tag inside your XML, the array of elementNames
will be ["root", "day1", "day1"]
.
现在有了它,可以通过查看elementNames
中的最后两项是否都是day1
来检查是否正在查看另一个day1
中的day1
.
Now that you have that, you can check to see if you are looking at day1
inside another day1
by seeing if the last two items in elementNames
are both day1
.
例如:
func beginParsing(URL: NSURL) {
let parser = NSXMLParser(contentsOfURL: URL)!
parser.delegate = self
parser.parse()
print(schedule)
}
var schedule: [String: String]?
var elementNames = [String]()
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
elementNames.append(elementName)
let count = elementNames.count
if count >= 2 && elementNames[count - 2] == "day1" && elementNames[count - 1] == "day1" {
schedule = attributeDict
}
}
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
elementNames.removeLast()
}
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
print(parseError)
}
这篇关于Swift XML属性解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!