【问题标题】:NSXMLparser parse() not workingNSXMLparser parse() 不工作
【发布时间】:2014-12-11 00:56:01
【问题描述】:

我正在开发一个游戏,其中有在 XML 文件中描述的障碍模式,所以我在我的 swift 文件中实现了这个类:

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)")
}

在我的另一个 swift 文件中,我写了这个:

// 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() 总是返回 no,即使这样 parserError 属性也没有告诉我任何东西(是 nil)。我也尝试过实现parseErrorOcurredvalidationErrorOcurred的方法,但是什么都没有……

如果你想看看 patterns.xml 文件,这里是:

<?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>

【问题讨论】:

  • 你有没有检查过URL的内容以及文件是否真的存在?
  • URL 似乎是正确的,而且文件肯定在那里,与我的其他文件在同一个文件夹中
  • 在我看来这不是有效的 XML...stackoverflow.com/questions/5042902/…

标签: ios xml swift ios8 nsxmlparser


【解决方案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 a 看起来不错。

  2. 如果你实现了NSXMLParserDelegate 协议的parseErrorOccurred 方法,它就会指出这些问题。

    我使用以下 parseErrorOccurred 方法运行了您原来的不正确的 XML:

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

    它正确地报告了:

    error = Error Domain=NSXMLParserErrorDomain Code=5 "操作无法完成。(NSXMLParserErrorDomain error 5.)" UserInfo=0x60000006eb40 {NSXMLParserErrorColumn=1, NSXMLParserErrorLineNumber=9, NSXMLParserErrorMessage=文档末尾的额外内容 }

  3. 如果您的委托方法没有被调用,请确保该文件存在于 Document 文件夹中:

    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)
    

【讨论】:

  • 好的,我已经按照你说的更正了我的代码,但我仍然遇到同样的问题。你是怎么从委托函数中得到这个错误的?我写的和你一模一样,但我什么都没有……
  • @lucas_turci 我建议检查以确保文件存在于您指定的文档路径中。它在那里吗?还是在捆绑包中?请参阅修改后的答案。
  • 谢谢 Rob,我刚刚解决了这个问题,我现在就发帖
  • 大声笑。这不是我刚才说的吗?但是,我猜你自己也独立确定了问题的根源。
  • 是的,当然!非常感谢!
【解决方案2】:

我的解决方案

我的问题确实是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2015-03-20
    • 2012-08-17
    • 2016-06-12
    相关资源
    最近更新 更多