Реорганизовать XML с помощью Java DOM - Hierarchy_Request_Error - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть 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();
}

Что мне нужно изменить, чтобы сделатьэто работает?

1 Ответ

0 голосов
/ 21 сентября 2018

Ваша итерация по узлам тестового примера неверна.Я изменил этот фрагмент ниже одного, и Ваш код работает:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...