在没有解析器工具的情况下解析XML字符串

时间:2011-12-22 21:04:16

标签: java string xml-parsing

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

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

当然,这个例子很简单。

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

我创建了一个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吗?

谢谢你, 问候。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这就是家庭作业的气味,所以你会得到一个过于简化的,可能有点的想法,你可以在闲暇时建立或忽视。考虑使用堆栈来跟踪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,你将有一个漫长的夜晚。