【问题标题】:Parsing an XML String without parsers tools在没有解析器工具的情况下解析 XML 字符串
【发布时间】:2011-12-22 21:04:16
【问题描述】:

我有以下字符串(它不是来自文件:它来自数据库):

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <person name="dave">
        <job>teacher</job>
        <job>musician</job>
    </person>
    <person name="chris">
        <job>farmer</job>
    </person>
</root>

当然,这个例子是简化的。

我必须使用基本的字符串函数“手动”解析它(例如:我不能使用 XML 解析器)。

我创建了一个 HashMap :

HashMap<String,ArrayList> personsAndJobs = new HashMap<String,ArrayList>

但是,我找不到可以像这样存储数据的好算法:

for each "person" tag {
   // put the "name" attribute in a HashMap 
   personsAndJobs.put(person.get("name"),null) 
   jobs = new ArrayList<String>();
   for each "job" of that person{
       jobs.add(job.getTagContent())
   }
   personsAndJobs.put(person.get("name"),jobs) 
}

这就是我尝试使用的算法。

谁能帮我把那个算法翻译成Java?

谢谢你, 问候。

【问题讨论】:

  • 为什么要求不使用 xml 解析器?无需重新发明轮子,除非您只是为了教育。
  • 此外,您可以只使用 Java XML 解析器的内置功能,因此如果“外部”解析器存在问题,这可以避免,因为它使用与 JVM 捆绑在一起的解析器。
  • 我不明白为什么你不能使用 xml 解析器?这是作业吗?
  • 它似乎已经成为算法了!当我都准备好时,我当然只会将人员和工作放在 personAndJobs 中,但否则你似乎朝着正确的方向前进。哦,至少对作业使用 HashSet 而不是 ArrayList,除非需要订购作业。如果有人得到一份特定的工作,这会更快地查找(例如,找到所有老师)。

标签: java string xml-parsing


【解决方案1】:

我将创建一个特殊的标签类,将标签名称和所有属性存储为字段以及对数组或数组列表中其子标签的引用。 然后将所有顶级标签放在他们自己的数组或数组列表中。从这里遍历所有 人和他们的子标签是小菜一碟。

【讨论】:

  • ArrayLists 在查找项目时很慢,我会随时使用 HashMap 和 HashSet。您可以轻松地遍历它们。
【解决方案2】:

这有点家庭作业的味道,所以你会得到一个过于简化的、可能是陈词滥调的想法,你可以在闲暇时建立或忽略。考虑使用堆栈来跟踪您在 xml 文档中的位置。

push root tag
While(stack is not empty)
    read tag
    if close tag
        pop tag, continue
    if person
        push tag onto tag stack
        get name, create person, add to persons stack, continue
    if job
        push tag onto tag stack
        get job, add job to person on top of the stack.
        pop tag

找出哪个标签通常不太难,使用 string.contains (“tag”) 就足够了。这一点点伪代码不是特别健壮,多行作业标签会破坏它,但只要有一点编程魔法,它就很容易处理。如果您被要求在 JAVA 中创建一个可靠、强大的 xmlparser,那么您将面临一个漫长的夜晚。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2019-05-03
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    相关资源
    最近更新 更多