2014-12-11 55 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)