【发布时间】:2021-09-17 00:55:28
【问题描述】:
我是 XML 新手,我想获得有关任务的帮助。我需要为 XML 文件编写一个解析器(见下文)。解析器应返回HashTable<String, List<String>>,其中键是操作名称,列表包含参数名称,其顺序与这些名称在 XML 文件中出现的顺序相同。这里最重要的是参数名称的顺序。
XML:
....
<actions>
<action>
<name>ActionName1</name>
<arguments>
<argument>
<name>name1</name>
<type>type1</type>
<comment>comment</comment>
</argument>
<argument>
<name>name2</name>
<type>type2</type>
<comment>comment</comment>
</argument>
<argument>
<name>name3</name>
<type>type3</type>
<comment>comment</comment>
</argument>
</arguments>
</action>
<action>
<name>ActionName2</name>
<arguments>
...
</arguments>
</action>
</actions>
代码:
...
String expression = "//actions/action";
XPathExpression compiled = xPath.compile(expression);
nodeList = (NodeList) compiled.evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
NodeList children = node.getChildNodes();
for (int j = 0; j < children.getLength(); j++) {
Node child = children.item(j);
if (child.getNodeName().equals("name")) {
//add new entry to map, meanwhile just print it
System.out.println(child.getTextContent());
continue;
}
if (child.getNodeName().equals("arguments")) {
Element element = (Element) child;
NodeList names = element.getElementsByTagName("name");
for (int k = 0; k < names.getLength() ; k++) {
Node nameNode = names.item(k);
//add element to list, meanwhile print it
System.out.println("\t" + nameNode.getTextContent());
}
}
}
代码可以运行,但它非常庞大并且有 2 个嵌套循环。 有没有更有效和简单的方法来实现所需的功能? 提前致谢。
【问题讨论】: