我正在尝试重新安排XML文件的所有属性。 需要对每个节点的所有属性进行分组。
<?xml version="1.0" encoding="UTF-8"?> <subject> <param name="A" value="a" /> <study> <param name="AA" value="aa" /> <series> <param name="AAA" value="aaa" /> <dataset> <param name="AAAA" value="aaaa" /> <data> <param name="AAAAA" value="aaaaa" /> </data> </dataset> <param name="BBB" value="bbb" /> </series> </study> <param name="B" value="b" /> </subject>
以下是所需的输出XML文件:
<?xml version="1.0" encoding="UTF-8"?> <subject> <param name="A" value="a" /> <param name="B" value="b" /> <study> <param name="AA" value="aa" /> <series> <param name="AAA" value="aaa" /> <param name="BBB" value="bbb" /> <dataset> <param name="AAAA" value="aaaa" /> <data> <param name="AAAAA" value="aaaaa" /> </data> </dataset> </series> </study> </subject>
在JAVA中使用XML DOM可以实现这一点吗?
答案 0 :(得分:0)
这应该让你开始。节点对象的类型为http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/Node.html
我没有使用foreach循环,因为Node.getChildNodes()返回getLength和item(i)但没有迭代器。
public void sortXML(Node newRoot, Node oldRoot)
{
for(int i=0; i<oldRoot.getChildNodes().getChildNodes().length(); i++)
{
if(oldRoot.getChildNodes().item(i).getType==ELEMENT_NODE)
{
if(oldRoot.getChildNodes().item(i).getName().equals("param"))
{
newRoot.appendChild(oldRoot.getChildNodes().item(i));//add param tags
}
}
}
for(int i=0; i<oldRoot.getChildNodes().length(); i++)
{
if(oldRoot.getChildNodes().item(i).getType==ELEMENT_NODE)
{
if(!oldRoot.getChildNodes().item(i).getName().equals("param"))
{
newRoot.appendChild(oldRoot.getChildNodes().item(i));//add non param tags
}
}
}
//reurse through the rest of the document
for(i=0;i<oldRoot.getChildNodes().length();i++)
{
sortXML(newRoot.getChildNodes.item(i),oldRoot.getChildNodes.item(i)
}
}
答案 1 :(得分:0)
public void groupParams(Node node) {
NodeList childNodes = node.getChildNodes();
List<Element> paramElements = new ArrayList<Element>();
for (int i = 0; i < childNodes.getLength(); i++) {
Node child = childNodes.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
if (child.getNodeName().equals("param")) {
paramElements.add((Element) child);
} else {
// Recursively group param elements in child node.
groupParams(child);
}
}
}
// Remove all param elements found from source node.
for (Element paramElement: paramElements) {
node.removeChild(paramElement);
}
// Sort param elements by attribute "name".
Collections.sort(paramElements, new Comparator<Element>() {
public int compare(Element e1, Element e2) {
String name1 = e1.getAttribute("name");
String name2 = e2.getAttribute("name");
return name1.compareTo(name2);
}
});
// Add param elements back to source node in sorted order.
Node firstNonParamNode = node.getFirstChild();
for (Node paramElement: paramElements) {
node.insertBefore(paramElement, firstNonParamNode);
}
}