2014-12-11 114 views
0

我工作的一個遊戲,其中有在一個XML文件中描述的障礙圖案,讓我實現了這個類在我的SWIFT文件:的NSXMLParser解析()不工作

class PatternsParser: NSObject, NSXMLParserDelegate 
{ 
var myParser: NSXMLParser! 
var arrayOfPatterns = [Element]() 
var currentId = 0 

init(url: NSURL) 
{ 
    myParser = NSXMLParser(contentsOfURL: url) 
    println(myParser.parserError?) 
    super.init() 
    myParser.delegate = self 
    if myParser.parse() 
    { 
     println("Was able to parse") 
    } 
} 

func parser(parser: NSXMLParser!, parseErrorOccurred parseError: NSError!) { 
    println("error = \(parseError)") 
} 

我的其他快捷文件我寫了這個:

// this is just a function to return the document path I use to create the NSURL 
func getXMLPath(pathName path:String) -> String? 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentsDirectory = paths[0] as String 
    let filePath: String? = documentsDirectory?.stringByAppendingPathComponent(path) 
    return filePath 
} 

    let buffer: NSURL! = NSURL(fileURLWithPath: getXMLPath(pathName:"patterns.xml")) 
    var patternParser = PatternsParser(url:buffer) 

不過,我得到的是myParser.parse()始終沒有返回,甚至因此parserError屬性不告訴我任何東西(爲零)。我也試過如果你想看看在patterns.xml文件執行方法parseErrorOcurredvalidationErrorOcurred,但沒有...

,那就是:

<?xml version="1.0"?> 
<game> 
    <pattern id="0" difficulty="0" width="800"> 
     <coinArea> 
      <rect x="100" y="470,5" width="12" height="5"/> 
     </coinArea> 
    </pattern> 

    <pattern id="1" difficulty="1" width="600"> 
     <coinArea> 
      <rect x="100" edge="up" width="8"/> 
     </coinArea> 
     <wall orientation="vertical" texture="wallText"> 
      <rect x="300" edge="down"/> 
     </wall> 
    </pattern> 

    <pattern id="2" difficulty="1" width="750"> 
     <wall orientation="vertical" texture="wallText"> 
      <rect edge="down" x="25"/> 
     </wall> 
     <wall orientation="vertical" texture="wallText"> 
      <rect edge="up" x="60"/> 
     </wall> 
     <electricLine orientation="horizontal"> 
      <rect edge="up" x="0"/> 
     </electricLine> 
    </pattern> 
</game> 
+1

你檢查了URL的內容以及文件是否真的存在嗎? – 2014-12-11 01:03:39

+0

該URL看起來是正確的,並且該文件當然存在,與我的其餘文件在同一文件夾中 – 2014-12-11 01:06:27

+1

這看起來對我而言不是有效的XML ... http:// stackoverflow。com/questions/5042902/xml-error-there-are-multiple-root-elements – borrrden 2014-12-11 02:02:56

回答

1
  1. 中的XML你原來的問題是無效的。您可以從Mac OS X Terminal運行xmllint命令,並指出(a)您缺少一個根元素來包裝各個pattern標記;和(b)您的electricLine開標籤錯誤輸入。它應該是:

    <?xml version="1.0"?> 
    <patterns> 
        <pattern id="0" difficulty="0" width="800"> 
         <coinArea> 
          <rect x="100" y="470,5" width="12" height="5"/> 
         </coinArea> 
        </pattern> 
    
        <pattern id="1" difficulty="1" width="600"> 
         <coinArea> 
          <rect x="100" edge="up" width="8"/> 
         </coinArea> 
         <wall orientation="vertical" texture="wallText"> 
          <rect x="300" edge="down"/> 
         </wall> 
        </pattern> 
    
        <pattern id="2" difficulty="1" width="750"> 
         <wall orientation="vertical" texture="wallText"> 
          <rect edge="down" x="25"/> 
         </wall> 
         <wall orientation="vertical" texture="wallText"> 
          <rect edge="up" x="60"/> 
         </wall> 
         <electricLine orientation="horizontal"> 
          <rect edge="up" x="0"/> 
         </electricLine> 
        </pattern> 
    </patterns> 
    

    你已經在你的修改後的問題中解決了這個問題。這個新的XML看起來很好。

  2. 如果您執行NSXMLParserDelegate協議的parseErrorOccurred方法,它會指出這些問題。

    我跑你原來的,不正確的XML具有以下parseErrorOccurred方法:

    func parser(parser: NSXMLParser!, parseErrorOccurred parseError: NSError!) { 
        println("error = \(parseError)") 
    } 
    

    它正確報道:

    錯誤=錯誤域= NSXMLParserErrorDomain代碼= 5「的操作不能(NSXMLParserErrorDomain error 5.)「UserInfo = 0x60000006eb40 {NSXMLParserErrorColumn = 1,NSXMLParserErrorLineNumber = 9,NSXMLParserErrorMessage =文檔末尾的額外內容 }

  3. 如果你的委託方法沒有得到調用,確保該文件存在於文件夾:

    let path = getXMLPath(pathName:"patterns.xml")! 
    if !NSFileManager.defaultManager().fileExistsAtPath(path) { 
        println("file NOT found at \(path)") 
    } else { 
        println("file found at \(path)") 
    } 
    let fileURL: NSURL! = NSURL(fileURLWithPath: path) 
    var patternParser = PatternsParser(url: fileURL) 
    
+0

好的,我已經按照你說的修正了我的代碼,但是我仍然有同樣的問題。你是如何從委託函數中得到這個錯誤的?我寫的和你一模一樣,但我什麼都沒有...... – 2014-12-11 10:24:52

+0

@lucas_turci我建議檢查一下,以確保文件存在於你指定的Documents路徑中。它在嗎?或者它在捆綁中?看修改後的答案。 – Rob 2014-12-11 15:23:02

+0

感謝羅布,我剛剛解決了這個問題,我現在要發佈它 – 2014-12-11 15:24:38

0

我的解決方案

我的問題真的是URL,所以而是採用

func getXMLPath(pathName path:String) -> String? 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
    let documentsDirectory = paths[0] as String 
    let filePath: String? = documentsDirectory?.stringByAppendingPathComponent(path) 
    return filePath 
} 

let buffer: NSURL! = NSURL(fileURLWithPath: getXMLPath(pathName:"patterns.xml")) 
var patternParser = PatternsParser(url:buffer) 

我取代它:

let bundle = NSBundle.mainBundle() 
let url: NSURL! = bundle.URLForResource("patterns", withExtension: "xml") 
var patternParser = PatternsParser(url: url)