【问题标题】:Reorganize XML using Java DOM - Hierarchy_Request_Error使用 Java DOM 重新组织 XML - Hierarchy_Request_Error
【发布时间】:2018-09-21 12:14:54
【问题描述】:

我有一个具有以下方案结构的 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();
}

我必须进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: java xml dom


    【解决方案1】:

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

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

    【讨论】:

    • 完美!现在我明白为什么我失败了,谢谢!对于那些将来阅读taht并且使用正确的库可能有问题的人:您需要导入org.w3c.dom库,即org.w3c.dom.Node
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2012-11-18
    • 2012-01-10
    • 2011-08-04
    • 2018-03-02
    相关资源
    最近更新 更多