首页 > 解决方案 > 使用 Java DOM 重新组织 XML - Hierarchy_Request_Error

问题描述

我有一个具有以下方案结构的 xml

<test>
    <testcase classname="TestsQuarantine.CreateUsers" name="Administrator"/>
    <testcase classname="TestsQuarantine.Login" name="documentMailQuarantine"/>
    <testcase classname="TestsClerk.CreateUsers" name="John"/>
</test>

我需要重新组织它

<test>
    <testsuite name="Quarantine">
        <testcase classname="TestsQuarantine.CreateUsers" name="Administrator"/>
        <testcase classname="TestsQuarantine.Login" name="documentMailQuarantine"/>
    </testsuite>
    <testsuite name="Clerk">
        <testcase classname="TestsClerk.CreateUsers" name="John"/>
    </testsuite>
</test>

此时,我正在将文件读取到 NodeList,遍历它,创建新的根并尝试将其切换为原始的以实现我需要的结构,但出现以下错误

HIERARCHY_REQUEST_ERR:试图插入不允许的节点。

发生在执行根切换的行中,我不知道为什么会这样..这是我的代码:

File file = new File(fullPath);
List<Element> clerk = null, 
        quara = null, 
        misc = null;

try {
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(file);
    NodeList nodes = doc.getElementsByTagName("test");
    Element root = doc.getDocumentElement(), 
            newRoot = doc.createElement("test");
    clerk = new ArrayList<Element>();
    quara = new ArrayList<Element>();
    misc = new ArrayList<Element>();

    for(int i=0; i < nodes.getLength(); i++) {
        Element node = (Element) nodes.item(i);
        if(node.getAttribute("classname").contains("Clerk")) {
            clerk.add(node);
        } else if(node.getAttribute("classname").contains("Quarantine")) {
            quara.add(node);
        } else {
            misc.add(node);
        }
    }

    if(clerk.isEmpty() == false) {
        Element clerkSuite = doc.createElement("testsuite");
        clerkSuite.setAttribute("name", "Clerk");
        for(Element el : clerk) {
            clerkSuite.appendChild(el);
        }
        newRoot.appendChild(clerkSuite);
    }

    if(quara.isEmpty() == false) {
        Element quaraSuite = doc.createElement("testsuite");
        quaraSuite.setAttribute("name", "Quarantine");
        for(Element el : quara) {
            quaraSuite.appendChild(el);
        }
        newRoot.appendChild(quaraSuite);
    }

    if(misc.isEmpty() == false) {
        Element miscSuite = doc.createElement("testsuite");
        miscSuite.setAttribute("name", "Miscellaneous");
        for(Element el : misc) {
            miscSuite.appendChild(el);
        }
        newRoot.appendChild(miscSuite);
    }

    root.getParentNode().replaceChild(newRoot, root);

    DOMSource original = new DOMSource(doc);
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    StreamResult overritten = new StreamResult(fullPath);
    transformer.transform(original, overritten);

} catch (Exception e) {
    e.printStackTrace();
}

我必须改变什么才能让它工作?

标签: javaxmldom

解决方案


您对测试用例节点的迭代不正确。我将该片段更改为以下片段,您的代码正在运行:

Node testNode = doc.getDocumentElement();
NodeList testCases= testNode.getChildNodes();

for(int i=0; i < testCases.getLength(); i++) {
    Node n = testCases.item(i);

    if (!(n instanceof Text)) {
        Element testCase = (Element) n;

        if (testCase.getAttribute("classname").contains("Clerk")) {
            clerk.add(testCase);
        } else if (testCase.getAttribute("classname").contains("Quarantine")) {
            quara.add(testCase);
        } else {
            misc.add(testCase);
        }
    }
}

推荐阅读