我需要用C#解析自定义文件格式。文件格式是Xcode项目的PBX文件。格式没有官方文档。但这很简单。这是一个简单的例子:
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
5143B90C1884374800F27FD8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90B1884374800F27FD8 /* Foundation.framework */; };
5143B90E1884374800F27FD8 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90D1884374800F27FD8 /* CoreGraphics.framework */; };
5143B9101884374800F27FD8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5143B90F1884374800F27FD8 /* UIKit.framework */; };
/* End PBXBuildFile section */
};
rootObject = 5143B9001884374800F27FD8 /* Project object */;
}
在objects部分中有一系列对象定义:对象唯一id后跟其属性。你可以在这里看到评论。属性值也可以用引号括起来。
PBX文件的完整示例是here。
现在我需要构建文件的DOM。解决这类任务的最佳方法是什么?
答案 0 :(得分:1)
使用解析器(因为嵌套大括号正则表达式是禁止的)。用语法选择你感觉合适的那个:
我想你是新手,所以这就是为什么我把它们分组 - 自上而下的方法,自下而上和组合的方法。我个人的偏好是自下而上,数学表达式的定义对我来说更自然,但在这里你不应该有这样的问题。
开始2014-01-28 NLT包括PBXProj文件简单阅读器。
答案 1 :(得分:0)
我发现Sprache项目对于这种类型的语法非常有用。
对于简单的解析案例,Regex也足够了。
答案 2 :(得分:0)
我在适当的时候使用Regex类,但是对于像你在这里展示的更多结构化数据,我会转向ANTLR as documented here for C#。
答案 3 :(得分:0)
如果您需要能够匹配嵌套大括号,则正则表达式将无法正常工作。您可以使用像ANTLR这样的解析器生成器,但这种格式看起来很简单,可以编写自己的recursive descent解析器。
在我们向您展示如何编写解析器之前,我们需要知道您想要输出哪种DOM。