使用javax.xml.stream包的xml生成解析

XML文件生成与加密
本文介绍了一种使用Java实现的XML文件生成方法,通过XMLWriter类将MyDataclass中的数据写入XML文件,并利用BASE64Encoder进行加密处理。文中详细展示了如何设置XML文档的属性及如何遍历数据集合来填充XML元素。

一、XML文件的生成

说明:

XMLWriter :读取传入的数据封装类(MyDataclass )中的数据写入到xml文件中,并用BASE64Encoder对数据进行加密。

MyDataclass :数据封装bean.

 

package com.test;

import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;

import org.apache.log4j.Logger;

import com.tsxd.trans.model.transdata.FieldData;
import com.tsxd.trans.model.transdata.RowData;
import com.tsxd.trans.model.transdata.TransToHospData;

public class XMLWriter {
 private static final Logger logger=Logger.getLogger(XMLWriter.class);
 
 private MyDataclass trans_data=null;
 private sun.misc.BASE64Encoder base64_encode;
 
 public XMLWriter(MyDataclass data){
  trans_data=data;
  base64_encode=new sun.misc.BASE64Encoder();
 }
 
 public boolean writeXml(String outputFileName){
  boolean result=false;
  if (null==trans_data){
   return false;
  }
  XMLOutputFactory outputFactory=XMLOutputFactory.newInstance();
  FileWriter output=null;
  XMLStreamWriter xmlWriter=null;
  long row_id=1;
  try{
   output=new FileWriter(new File(outputFileName));
   xmlWriter=outputFactory.createXMLStreamWriter(output);
   xmlWriter.writeStartDocument("GB2312","1.0");
   xmlWriter.writeStartElement("root");
  
   xmlWriter.writeStartElement("version");
   xmlWriter.writeCharacters("1.0");
   xmlWriter.writeEndElement();//end of version

   xmlWriter.writeStartElement("metadatas");
   xmlWriter.writeStartElement("metadata");
   SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   xmlWriter.writeAttribute("generatetime",sf.format(new Date()));
   xmlWriter.writeAttribute("generate_org_code", trans_data.getGenerate_org_code());
   xmlWriter.writeAttribute("charset_encode", "GB2312");
   xmlWriter.writeAttribute("dest_org_id",trans_data.getDest_org_id());
   xmlWriter.writeEndElement(); //end of metadata
   xmlWriter.writeEndElement(); //end of metadatas
   
   xmlWriter.writeStartElement("data");
   xmlWriter.writeAttribute("tablename", base64_encode.encode(trans_data.getTablename().getBytes()));
   
   List<RowData> row_list=trans_data.getRow_datas();
   for(int i=0;i<(row_list.size());i++){
    RowData row_data=row_list.get(i);
    xmlWriter.writeStartElement("row");
    xmlWriter.writeAttribute("op", "");
    xmlWriter.writeAttribute("row_id", String.valueOf(row_id));
    List<FieldData> field_datas=row_data.getField_datas();
    for(int j=0;j<field_datas.size();j++){
     FieldData field=field_datas.get(j);
     xmlWriter.writeStartElement(base64_encode.encode(field.getField_name().getBytes()));
     xmlWriter.writeCharacters(base64_encode.encode(field.getData_value().getBytes()));
     xmlWriter.writeEndElement();//end of fieldname
    }
    row_id=row_id+1;
    xmlWriter.writeEndElement();//end of row
   }
   
   xmlWriter.writeEndElement(); //end of data
   xmlWriter.writeEndElement(); //end of root
   
   xmlWriter.close();
   output.close();
   
   result=true;
  }catch(Exception e){
   logger.error("产生 "+outputFileName+"时发生了错误!");
   logger.error(e.getMessage(),e);
  }finally{

   if (xmlWriter!=null){
    try{
     xmlWriter.close();
    }catch(Exception e){
     
    }
   }
   if (output!=null){
    try{
     output.close();
    }catch(Exception e){
     
    }
   }
  }
  
  return result;
 }
 
}

<think>好的,用户现在想要使用Java中的javax.xml.parsers.DocumentBuilder来实现修改XML文件中的ResourceMapFile字段。之前已经给出了Python的解决方案,现在需要转换为Java代码。我需要考虑几个方面: 首先,用户可能对Python比较熟悉,但现在需要在Java环境中操作XML,所以需要确保代码符合Java的XML处理规范。其次,用户提到的DocumentBuilder是Java标准库的一部分,属于比较传统的XML处理方式,可能用户不希望引入第三方库如DOM4J等。 接下来,我需要回忆如何使用DocumentBuilder来解析和修改XML文档。步骤大致是:创建DocumentBuilderFactory实例,设置合适的属性(比如忽略注释、处理空白等),然后解析XML文件,获取Document对象。之后,遍历或搜索到目标节点,修改其文本内容,最后将修改后的Document写回文件。 需要注意的是,原XML文件使用的是gb2312编码,所以在读取和写入时都必须指定正确的编码,否则会出现乱码问题。另外,Java的XML处理在保存时默认可能使用UTF-8,因此必须显式设置编码为gb2312,并确保XML声明中的编码也正确。 然后,查找目标节点。用户的XML结构中,ResourceMapFile位于GeneratePipeLine节点下,所以XPath表达式可能是//GeneratePipeLine/ResourceMapFile。不过,XPath在Java中的使用需要依赖XPathFactory,或者手动遍历节点。考虑到代码的简洁性,使用XPath会更方便,但需要处理可能的异常和命名空间问题。不过原XML没有命名空间,所以XPath表达式可以简化。 另外,用户可能需要代码示例,所以需要提供一个完整的Java类,括读取、修改、保存的步骤。同时,需要注意文件路径的处理,确保输入和输出路径正确,并且处理可能的异常,如ParserConfigurationException、SAXException、IOException等。 可能遇到的陷阱:在保存XML时,使用Transformer时忘记设置编码,导致编码错误。因此,在TransformerFactory中需要设置OutputProperties,指定编码为gb2312,并且保持XML声明中的版本和编码正确。 另外,用户可能希望替换后的路径是一个变量,所以在代码中需要明确注释替换的位置,让用户知道如何修改新路径的值。例如,将newResourcePath变量设置为目标值。 最后,需要测试代码是否能够正确读取原文件,修改指定节点,并保存为正确编码的文件,同时保持XML结构不变。可能还需要处理节点不存在的情况,但根据用户提供的示例XML,ResourceMapFile节点存在,所以暂时不需要处理异常情况,但代码中最好添加检查,避免空指针异常。 总结,需要编写的Java代码应括以下步骤: 1. 创建DocumentBuilder并解析XML文件。 2. 使用XPath定位到ResourceMapFile节点。 3. 修改节点的文本内容。 4. 使用Transformer保存修改后的Document,确保编码为gb2312。</think>以下是使用 **Java 标准库 `javax.xml.parsers.DocumentBuilder`** 修改 XML 文件中 `ResourceMapFile` 字段的完整代码示例: --- ### **Java 代码实现** ```java import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; public class ModifyXmlResourceMap { public static void main(String[] args) { try { // 1. 读取 XML 文件(注意编码为 gb2312) File xmlFile = new File("input.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(xmlFile); // 2. 定位到目标节点 <ResourceMapFile> NodeList resourceMapNodes = doc.getElementsByTagName("ResourceMapFile"); if (resourceMapNodes.getLength() == 0) { System.err.println("未找到 ResourceMapFile 节点!"); return; } // 3. 修改节点内容 Node resourceMapNode = resourceMapNodes.item(0); String newPath = "D:/new_project/your_material.material"; // 替换为你的新路径 resourceMapNode.setTextContent(newPath); // 4. 保存修改后的 XML(保持原编码 gb2312) TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 设置编码和 XML 声明 transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312"); transformer.setOutputProperty(OutputKeys.STANDALONE, "no"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("modified.xml")); transformer.transform(source, result); System.out.println("XML 修改完成!"); } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### **关键步骤解析** 1. **读取 XML 文件** 使用 `DocumentBuilder` 解析 XML,注意文件路径需替换为实际路径。 2. **定位目标节点** 通过 `getElementsByTagName("ResourceMapFile")` 查找所有同名节点。如果存在多个同名节点,需进一步通过父节点 `GeneratePipeLine` 筛选。 3. **修改节点值** 直接调用 `setTextContent(newPath)` 更新内容。 4. **保持原编码保存** 通过 `Transformer` 设置输出编码为 `gb2312`,确保与原文件一致。 --- ### **注意事项** - **编码一致性** 输入输出均需指定 `gb2312`,避免中文字符乱码。 - **节点存在性检查** 若 XML 中无 `ResourceMapFile` 节点,代码会提示错误。 - **路径格式** Windows 路径中的反斜杠 `\` 需在字符串中写为 `\\`(如 `D:\\new\\path`)。 如果需要更复杂的逻辑(如动态路径生成),可在此基础上扩展!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值