실제로 사용할 수있는 형식으로 계층 적 XML 값을 가져 오는 데 문제가 발생했습니다. 따라서 도움이 많이 필요합니다. 나는 Swift와 IOS 개발에 상당히 익숙하기 때문에 솔직하게 말하면 파서를 완전히 이해하지 못한다. 그러나 나는 희망을 품는다.NSXMLParser를 사용하여 Swift에서 계층 적 XML 구문 분석
다음은 구문 분석하려고하는 XML의 예입니다. 이것은 비누 웹 서비스에서 다시 나타납니다. 연결 및 데이터를 가져 오는 측면에서 그 모든 측면 그렇게 코드로 다시 분류를 얻는 방법,
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<get_Entry_DetailsResponse
xmlns="http://tempuri.org/">
<get_Entry_DetailsResult>
<ApiResult
xmlns="">
<Status>Success</Status>
<Parameters>
<TotalRecords>1</TotalRecords>
<Records>
<Entry>
<Entry_ID>1234</Entry_ID>
<Title>This is the Title</Title>
<Description>This is a description.</Description>
<Charge_USD>3</Charge_USD>
<Charge_GBP>1.5</Charge_GBP>
<Classifications>
<Classification_Type>No. Of Colours</Classification_Type>
<Description>10</Description>
<Classification_Type>Height</Classification_Type>
<Description>16.712</Description>
<Classification_Type>Width</Classification_Type>
<Description>1.485</Description>
<Classification_Type>Width Count</Classification_Type>
<Description>11</Description>
<Classification_Type>Pages</Classification_Type>
<Description>6</Description>
<Classification_Type>Type</Classification_Type>
<Description>Type Description</Description>
<Classification_Type>Topic</Classification_Type>
<Description>Transport</Description>
<Classification_Type>Item</Classification_Type>
<Description>Shop Item</Description>
<Classification_Type>Material</Classification_Type>
<Description>Metal</Description>
<Classification_Type>Manufacturer</Classification_Type>
<Description>Unknown</Description>
</Classifications>
</Entry>
</Records>
</Parameters>
</ApiResult>
</get_Entry_DetailsResult>
</get_Entry_DetailsResponse>
</s:Body>
</s:Envelope>
그래서 나는 Entry_ID, 제목, 설명, Charge_GBP 및 Charge_USD 잘 같은 요소를 얻을 수 있습니다 완벽하게 잘 작동 실제로 페이지에서 출력 할 수 있습니다. 여기 그런
func connectionDidFinishLoading(connection: NSURLConnection!) {
var xmlParser = NSXMLParser(data: mutableData)
xmlParser.delegate = self
xmlParser.parse()
xmlParser.shouldResolveExternalEntities = true
}
XmlParser가 위임 물건 : 그래서 여기
내 내가 파서를 시작 connectionDidFinishLoading 및 실행입니다
var mutableData:NSMutableData = NSMutableData.alloc()
var currentElementName:NSString = ""
var foundCharacters = ""
var appParsedData = [Dictionary<String, String>]()
var currentDataDictionary = Dictionary<String, String>()
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) {
currentElementName = elementName
}
func parser(parser: NSXMLParser, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {
if !foundCharacters.isEmpty {
currentDataDictionary[currentElementName] = foundCharacters
foundCharacters = ""
//Last Element so add to main Dictionary
//Cannot find last element yet on XML so use Charge_GBP for testing until fixed
if currentElementName == "Charge_GBP" {
appParsedData.append(currentDataDictionary)
}
}
}
func parser(parser: NSXMLParser, foundCharacters string: String!) {
if (currentElementName == "Entry_ID") || (currentElementName == "Title") || currentElementName == "Description" || currentElementName == "Charge_USD" || currentElementName == "Charge_GBP" || currentElementName == "Classification_Type" {
foundCharacters += string
}
}
func parserDidEndDocument(parser: NSXMLParser!) {
self.setupItemsOnView()
}
그럼 내 setupItemsOnView 기능 내가하고자하는 곳이다 값을 가져 와서 뷰 컨트롤러에 표시하는 방법은 다음과 같습니다.
func setupItemsOnView() {
for (currentElementName) in appParsedData {
println("\(currentElementName):")
}
let test = appParsedData[0] as Dictionary<String, String>
let test_entryid = test["Entry_ID"]
println("Entry ID is \(test_entryid)")
}
Phew, ok, 기본적으로 setupItemsOnView 함수에서 Entry_ID, Title, Description, Charge_GBP 및 Charge_USD 값을 얻을 수 있지만이 방법을 사용하면 분류 부모로부터 의미있는 방법으로 다시 분류 및 설명 값을 가져올 수 없습니다. 현재 데이터를 저장할 사전을 볼 수 있기 때문에 현재 사용하고 있습니다. 따라서 사전을 사용하는 것이 계층 적 XML을 사용하는 경우 올바른 일인지 아닌지 궁금합니다.하지만 그 밖의 다른 방법을 알지 못합니다.
내 배경에서 점 표기법으로 XML을 참조하고 모든 요소에 대해 부모 주위를 반복 할 수는 있지만 신속하게 처리 할 수는 없으므로 사용할 수있는 방법이 필요합니다. 출력 할 수있는 양식으로 모든 데이터를 다시 가져 오십시오.
도움을 주실 수있는 코드는 매우 유용 할 것입니다. 당신이 원하는 무엇
건배
D
저에게 많은 감사의 뜻을 전합니다. 그러나 하나의 작은 질문, 같은 일이지만 계층 구조의 다른 영역에서 호출되는 요소는 어떻게 처리합니까? 항목 부모 태그에 설명 하위 요소가 있고 분류 상위에 여러 설명 하위 항목이 있습니까? 파서는이 모든 것을 설명으로보고 볼 수있는 것으로부터 부모님이이 데이터로 무엇을해야하는지 알지 못합니다. – Dave
나는이 문제를 안다. 스키마는''요소와 그 요소 인' '요소의 순서에 의존한다는 점에서 결함이있는 것으로 보인다.이것은'inClassifications'와'lastClassificationTypeElementParsed'와 같은 추가 상태 변수를 가져야 함을 의미합니다. 당신은 일하기 위해서는주의 깊게 상태를 유지해야하지만, 그것은 할 수있는 것 같습니다. –
fred02138
고마워, 나는 당신이 제안한대로 작동하도록했다. 포인터에 대해 많은 감사드립니다 !! – Dave