1

我有一个这样组织的 XML 文件,每个节点下的项目总是按字母顺序排列:

<xml>
    <node id="2">
        <jack>Jack wrote this.</jack>
        <john>John wrote this.</john>
    </node>

    <node id="4">
        <jack>Jack wrote this.</jack>
        <jill>Jill wrote this.</jill>
    </node>

    <node id="9">
        <jack>Jack wrote this.</jack>
        <james>James wrote this.</james>
        <jill>Jill wrote this.</jill>
        <john>John wrote this.</john>
    </node>
</xml>

如您所见,并非所有名称都在每个节点下。例如,在 中<node id="4">,John 和 James 没有写任何东西。对于上面的示例,我希望我的程序返回如下内容:

James did not write 2, 4
Jill did not write 2
John did not write 4

我需要跟踪谁没有写什么。我目前正在解析这样的文档:

private static String getTagValue(final Element element)
{
    String theId="";
    if (element.getTagName().startsWith("node")){

        theId = element.getAttribute("id");
        return theId;
    }
    return theId;
}


private static void readXML(String fileName){

    for (int index = 0; index < nodeList.getLength(); index++){

                Node node = nodeList.item(index);
                Element element = (Element) node;

                if (node.getNodeType() == Node.ELEMENT_NODE){

                    // This prints the node id
                    if(getTagValue(element)!=""){
                        System.out.println(getTagValue(element)+" = I am the node id number!");
                    }

                    // This prints the name
                    else{
                        System.out.println(element.getTagName()+" = I am the name!");
                    }
                }
            }
}

我想做的是以某种方式将每个节点下的元素与包含所有名称的“控制”列表进行比较,如果它不包含名称,它会返回名称及其父节点。

实际上,我处理的 XML 要大得多,因此性能很重要,但概念是相同的。任何帮助都会很棒。

4

2 回答 2

1

保持两套。一个是所有名称的主集 ( A)。第二个是您在每次迭代中建立的一组回答问题的人 ( B)。那么没有回答的人会是A - B,你可以这样做Collection#removeAll(Collection c)

A.removeAll(B);

您提到您想在一行中打印出一个人没有回答的答案。为此,您可以维护一个映射 ( Map<String, List<Integer>>),将一个人的姓名映射到他们没有回答的问题编号列表中。您可以通过A.removeAll(B)在一次迭代结束时检查 的结果来做到这一点。

因此,一旦您完成了对所有节点的循环,您最终会得到一张地图,该地图为您提供与他们未回答的问题列表相关联的每个名称。然后,您可以遍历此地图并打印出您需要的内容。

于 2012-10-09T21:18:29.507 回答
0

从功能的角度来看,我会说功能可能如下:

  • For Each Node 节点获取 xml 文件中的所有子节点
  • 将每个子节点的名称与对照样本节点名称进行比较
  • 如果节点名称匹配,则中断子循环
  • 如果在控制组的 for 循环完成之前名称不匹配,则找不到控制组的打印语句名称
于 2012-10-09T21:19:41.450 回答