java - 使用 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();
}
我必须改变什么才能让它工作?
解决方案
您对测试用例节点的迭代不正确。我将该片段更改为以下片段,您的代码正在运行:
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);
}
}
}
推荐阅读
- postgresql - 使用 Docker 创建 OSM 切片服务器的问题
- python - 如何将 graphviz (.dot) 文件上传到 Neo4j?
- reactjs - 反应网站的哪些内容管理?
- numpy - 使用matplotlib绘图将x轴设置为数据框列的日期时间范围内的月份
- python - 如何使用 Python 的 dpkt 模块处理数据包捕获
- docker - 支持 Docker 的 EMR 6 Beta 存在 S3 访问问题
- java - 目标 org.bsc.maven:maven-processor-plugin:4.0-rc1:process failed 的执行过程
- vue.js - 在 Vue.js 中使用带有 font-awesome 的变体
- angular - 从延迟加载的模块内部提供自定义 `RouteReuseStrategy` 不起作用
- laravel - 如何在使用 axios 从 API 获取数据时更新我的 VueJs Data 函数属性值?