首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读XML的好策略是什么?

阅读XML的好策略是什么?
EN

Software Engineering用户
提问于 2016-10-25 06:16:36
回答 3查看 143关注 0票数 0

我希望使用Java以如下格式读取数据。

代码语言:javascript
复制
 [scenario]
     id=my_first_scenario
     next_scenario=null
     name=_"My First Scenario."
     map_data="{~add-ons/my_first_campaign/maps/my_first_map.map}"
     turns=30
     [side]
         side=1
         controller=human
         team_name="good"
         user_team_name= _ "My Team"
         id=MyLeader
         name= _ "My Leader's Name"
         type="Elvish Ranger"
         unrenameable=yes
         canrecruit=yes
         recruit="Elvish Fighter, Elvish Archer, Elvish Shaman"
         gold=100
     [/side]
     [side]
        side=2
        controller=ai
        team_name="bad"
        user_team_name= _ "Bad Guys"
        id="EnemyLeader"
        name= _ "My Villain"
        type= "Orcish Warrior"
        unrenameable=yes
        canrecruit=yes
        recruit="Orcish Grunt, Orcish Archer, Orcish Assassin, Wolf Rider"
        gold=100
     [/side]
 [/scenario]

我想要开发一个API,它可以以通用的方式读取这样的内容,例如,有像getChildrengetAttributes这样的方法。我想知道是否有支持这类任务的库。

以下是我想出的,

  • 因为这是一种它自己的简单语言(比如XML),我应该使用像antlr这样的库吗?还是这个任务太复杂了?
  • 我应该使用regex来解析这些数据吗?
  • 我是否应该以流的形式手动处理文本,并在标记/属性到达时识别它们?
  • 还是有一种比上述更好/不同的方式?

对于任何感兴趣的人来说,这种标记语言是在一个名为为卫斯诺思而战的游戏中使用的,它是在c++中使用的。我想使用Java解析这些数据。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2016-10-25 06:31:31

游戏是开源软件,所以您应该下载源代码,找到解析源代码的代码,或者将其从C++移植到Java,或者以某种方式将C++组件添加到项目中。后者可能更好,因为如果它们更改或扩展标记语言,它将使您能够轻松地合并来自游戏的更新。

这很可能比尝试编写自己的解析器容易得多。这看起来像是一种非常复杂的定制标记语言,基于它们的文档。

此外,它可能是值得联系游戏的开发团队,并获得一些反馈,你的想法。这可能是他们感兴趣的事情,或者他们可能至少有一些关于如何继续下去的建议。

更新:您可能无法避免解析整个语法,因为您正在做一些“简单”的事情。

假设您只想捕获type=[value]的所有情况。看起来很简单,对吧?很遗憾,我不会。用户可以定义如下宏:

代码语言:javascript
复制
#define OOPS_YOUR_CODE_BROKE X
[unit]
    type=X
[/unit]
#enddef

{OOPS_YOUR_CODE_BROKE 23}

这相当于:

代码语言:javascript
复制
[unit]
    type=23
[/unit]

因此,即使是最简单的捕获也需要理解整个语法,如果您希望它完全正确的话。

票数 4
EN

Software Engineering用户

发布于 2016-10-25 06:24:46

我只需要编写自己的解析器,因为实际上只有两(3)种可能的情况是由一行中的第一个非空白字符标识的:

  • 如果它是一个括号,创建一个新的子元素并使其当前或返回到父级。
  • 如果是字母,请读取当前节点的属性。

也只使用原始文本解析。使用正则表达式将花费很少的收益,海事组织。

票数 1
EN

Software Engineering用户

发布于 2016-10-25 11:12:45

这种格式类似于YAML。考虑使用正则表达式和标准的YAML解析器转换为YAML。您需要对可翻译的文本进行编码,该文本由下划线和ID表示(非引用文本文本)。

学习YAML

票数 -1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/334520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档