生成XML文档的两种方式

我在解析XML的两种方式一文中,详细介绍了两种两种解析方法:

  1. 树形解析
  2. 流机制解析

同样,在本文中,我仍然会介绍两种机制生成XML文档的方法。个人认为,由于生成XML文档的代码过于繁琐,故除一些特殊情形,人为制作XML文档可能比代码生成速度更快。anyway,下面还是一一介绍两种不同生成XML文档的方式。

写树形结构

这种方式的基本思路为,先搭建起Document对象,然后将Document对象的结构和内容写入XML文件中。
以写如下所示的XML为例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE Log SYSTEM "log.DTD">
<Log>
<!--log filename-->
<Filename extension="xml" type="log">java</Filename>
<!--log limit,must between 10485760(10M) and 52428800(50M)-->
<Limit>20971520</Limit>
<!--log count,cannot be lower than 1-->
<Count>100</Count>
<!--whether to follow the existing file to write,just allow 'TRUE' or 'FALSE' and case insensitive-->
<isAppend>true</isAppend>
<!--Whether to compress the log,just allow 'True' or 'FALSE' and case insensitive-->
<isCompress>true</isCompress>
</Log>

实现的代码如下:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.*;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import javax.xml.transform.TransformerException;
public class xmlTest
{
 public static void main(String[] args) throws ParserConfigurationException,TransformerFactoryConfigurationError,TransformerConfigurationException,TransformerException
 {
  DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
  DocumentBuilder builder=factory.newDocumentBuilder();
  Document doc=builder.newDocument();//首先创建一个Document对象
  doc.setXmlVersion("1.0");//设置文档版本号
  doc.setXmlStandalone(false);//false表示需要校验XML,否则不需要校验XML,关于XML文档校验,[验证XML文档](https://editor.csdn.net/md/?articleId=106038399)一文有详细介绍
  Element root=doc.createElement("Log");//创建元素
  doc.appendChild(root);//添加根元素
  root.appendChild(doc.createComment("log filename"));//创建注释,并添加注释
  Element filename=doc.createElement("Filename");
  filename.setAttribute("extension","xml");//设置元素Filename属性
  filename.setAttribute("type","log");
  filename.appendChild(doc.createTextNode("java"));//设置元素Filename的文本内容
  root.appendChild(filename);
  root.appendChild(doc.createComment("log limit,must between 10485760(10M) and 52428800(50M)"));
  Element limit=doc.createElement("Limit");
  limit.appendChild(doc.createTextNode("20971520"));
  root.appendChild(limit);
  root.appendChild(doc.createComment("log count,cannot be lower than 1"));
  Element count=doc.createElement("Count");
  count.appendChild(doc.createTextNode("100"));
  root.appendChild(count);
  root.appendChild(doc.createComment("whether to follow the existing file to write,just allow 'TRUE' or 'FALSE' and case insensitive"));
  Element append=doc.createElement("isAppend");
  append.appendChild(doc.createTextNode("true"));
  root.appendChild(append);
  root.appendChild(doc.createComment("Whether to compress the log,just allow 'True' or 'FALSE' and case insensitive"));
  Element compress=doc.createElement("isCompress");
  compress.appendChild(doc.createTextNode("true"));
  root.appendChild(compress);
  TransformerFactory transFactory=TransformerFactory.newInstance();
  Transformer transformer=transFactory.newTransformer();
  transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,"log.DTD");//设置XML文档文档类型定义文件
  transformer.setOutputProperty(OutputKeys.INDENT,"yes");//是否缩进
  transformer.setOutputProperty(OutputKeys.METHOD,"xml");//生成xml
  transformer.transform(new DOMSource(doc),new StreamResult(new File("./logConfig.xml")));//将Document对象的结构和内容写入xml文件
 }
}

StAX

StAX没有缩进的功能,所以由StAX生成的XML文件,元素之间凑在一起。
以生成如下内容的XML文件为例:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE SYSTEM "log.DTD"><Log><!--log filename--><Filename extension="xml" type="log">java</Filename><!--log limit,must between 10485760(10M) and 52428800(50M)--><Limit>20971520</Limit><!--log count,cannot be lower than 1--><Count>100</Count><!--whether to follow the existing file to write,just allow 'TRUE' or 'FALSE' and case insensitive--><isAppend>true</isAppend><!--Whether to compress the log,just allow 'True' or 'FALSE' and case insensitive--><isCompress>true</isCompress><image path="text.gif"/></Log>

完整的代码如下:

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLStreamException;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
public class xmlTest
{
 public static void main(String[] args) throws FactoryConfigurationError,XMLStreamException,FileNotFoundException
 {
  XMLOutputFactory factory=XMLOutputFactory.newInstance();//创建工厂对象
  XMLStreamWriter writer=factory.createXMLStreamWriter(new FileOutputStream("./logConfig.xml"),"UTF-8");//创建XMLStreamWriter对象
  writer.writeStartDocument("UTF-8","1.0");//如果需要加编码规则,那么在创建XMLStreamWriter对象时继续指定编码规则,否则报错Underlying stream encoding 'GBK' and input paramter for writeStartDocument() method 'UTF-8' do not match
  writer.writeDTD("<!DOCTYPE SYSTEM \"log.DTD\">");//写DTD内容
  writer.writeStartElement("Log");//根节点起始标签
  writer.writeComment("log filename");//注释
  writer.writeStartElement("Filename");//元素Filename起始标签
  writer.writeAttribute("extension","xml");//元素属性
  writer.writeAttribute("type","log");
  writer.writeCharacters("java");//元素文本
  writer.writeEndElement();//元素Filename结束标签
  writer.writeComment("log limit,must between 10485760(10M) and 52428800(50M)");
  writer.writeStartElement("Limit");
  writer.writeCharacters("20971520");
  writer.writeEndElement();
  writer.writeComment("log count,cannot be lower than 1");
  writer.writeStartElement("Count");
  writer.writeCharacters("100");
  writer.writeEndElement();
  writer.writeComment("whether to follow the existing file to write,just allow 'TRUE' or 'FALSE' and case insensitive");
  writer.writeStartElement("isAppend");
  writer.writeCharacters("true");
  writer.writeEndElement();
  writer.writeComment("Whether to compress the log,just allow 'True' or 'FALSE' and case insensitive");
  writer.writeStartElement("isCompress");
  writer.writeCharacters("true");
  writer.writeEndElement();
  writer.writeEmptyElement("image");
  writer.writeAttribute("path","text.gif");
  writer.writeEndElement();//根节点结束标签
  writer.writeEndDocument();
  writer.close();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_ostream TYPE REF TO if_ixml_ostream, l_renderer TYPE REF TO if_ixml_renderer, l_document TYPE REF TO if_ixml_document. DATA:l_element_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *Creating a ixml factory l_ixml = cl_ixml=>create( ). *Creating the dom object model l_document = l_ixml->create_document( ). *Fill root node with value ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Connect internal XML table to stream factory l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering the document l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值