2011-12-22 123 views
1

我有以下字符串(它不是来自一个文件:它来自DB):一个XML字符串解析没有解析器工具

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

这是我想要的alogrithm落实到位。

任何人都可以帮助我将该算法转换成Java?

谢谢, 问候。

+3

为什么要求不使用xml解析器?除非你只是为了教育,否则不需要重新发明轮子。 – 2011-12-22 21:06:46

+1

另外,您可以使用内置的Java XML解析器,因此,如果“外部”解析器出现问题,则可以避免它,因为它使用与JVM捆绑在一起的解析器。 – Michael 2011-12-22 21:13:01

+0

我不明白为什么你不能使用XML解析器?这是一项功课吗? – 2011-12-22 21:14:18

回答

0

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

+0

ArrayLists在查找项目时速度很慢,我会随时去做HashMap和HashSet。您可以轻松地遍历它们。 – 2011-12-22 21:18:44

0

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