INVALID_CHARACTER_ERR: 指定的 XML 字符无效或非法。

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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值