1下面是要读取的xml文件
<?xml version="1.0" encoding="GBK" standalone="no"?><学校>
<学生><学生姓名>tom</学生姓名><学生性别>男</学生性别><学号>2013483124</学号></学生><学生>
<学生姓名>tom</学生姓名><学生性别>男</学生性别><学号>2013483124</学号></学生></学校>
2读取上面文件内容并写入到另一个文件结果报错
3尝试输出了每次遍历的节点,结果如下
4#text不是Element对象(#text输出造成原因是因为xml文件每行的节点未正确结束,
上面的xml文件第二行<学生>节点由于有内容并未结束,所以dom读取时会换行读取,就输出#text).。
如下xml文件内容则不会输出#text
<?xml version="1.0" encoding="GBK" standalone="no"?><学校>
<学生><学生姓名>tom</学生姓名><学生性别>男</学生性别><学号>2013483124</学号></学生>
<学生><学生姓名>tom</学生姓名><学生性别>男</学生性别><学号>2013483124</学号></学生></学校>
5如果xml文件内容量大,那么去手动调节节点换行就不好了,直接在读取的时候加入对节点的判断是否是Element
if (childlist.item(i) instanceof Element){}
6最后附上我的代码
public static void main(String[] args) throws Exception {
makexmldata("F:\\test.xml","F:\\test2.xml");
}
/**
*
* @param xmlfilepath 源xml文件位置
* @param desxmlfilepath 生成的目标xml文件位置
* @throws Exception
*/
private static void makexmldata(String xmlfilepath,String desxmlfilepath)
throws Exception {
// 读xml文件,得到document文档对象
File f = new File(xmlfilepath);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析
Document doc = builder.parse(f);
// 写xml文件
DocumentBuilderFactory factorywrite = DocumentBuilderFactory.newInstance();
DocumentBuilder builderwrite = factorywrite.newDocumentBuilder();
Document docwrite = builderwrite.newDocument();
// 创建新xml文档根元素
Element root = docwrite.createElement("学校");
docwrite.appendChild(root);
// 获取原始xml中名称为学生的所有节点
NodeList nl = doc.getElementsByTagName("学生");
for (int i = 0; i < nl.getLength(); i++) {
// 创建新xml文档子节点学生
Element element = docwrite.createElement("学生");
// 换行
element.setTextContent("\n");
// childlist 学生节点中的所有子节点
NodeList childlist = nl.item(i).getChildNodes();
for (int j = 0; j < childlist.getLength(); j++) {
if (childlist.item(j) instanceof Element) {
// 根标签学校添加学生节点对象
root.appendChild(element);
// 获取节点学生中的子节点对象
Element nameElement = docwrite.createElement(childlist.item(j).getNodeName());
Text value = docwrite.createTextNode(childlist.item(j).getTextContent());
element.appendChild(nameElement);
nameElement.appendChild(value);
}
System.out.println(childlist.item(j).getNodeName());
}
}
// 设置输出文件xml文件内容的编码方式为gbk,避免乱码
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.ENCODING, "GBK");
// 生成新的xml文件到指定位置
t.transform(new DOMSource(docwrite),
new StreamResult(new FileOutputStream(new File(desxmlfilepath))));
}