`
sunway
  • 浏览: 115154 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML to XML 转换的类

阅读更多

/**
 * <p>
 * Title: Parser类
 * </p>
 * <p>
 * Description: xml之间转换主类
 * </p>
 * <p>
 * Copyright: Copyright (c) 2009
 * </p>
 * <p>
 * 
 * </p>
 *
 * 
 * @version 1.0
 */

public class Parser {
 //存放规则文件schema文件的绝对路径
 private String ruleSchemaPath;
 //存放规则文件的绝对路径
 private String rulePath;
 //存放源文件的绝对路径
 private String sourcePath;
 //存放结果文件的绝对路径
 private String targetFileFullName;
 //存放根据规则文件生成的Document对象
 private Document doc;
 
 
 public String getRuleSchemaPath() {
  return ruleSchemaPath;
 }
/**
 * 设置规则文件schema的绝对路径
 * @param ruleSchemaPath
 */
 public void setRuleSchemaPath(String ruleSchemaPath) {
  this.ruleSchemaPath = ruleSchemaPath;
 }

 public Document getDoc() {
  return doc;
 }

 public void setDoc(Document doc) {
  this.doc = doc;
 }

 public String getSourcePath() {
  return sourcePath;
 }
/**
 * 设置源xml文件的绝对路径
 * @param sourcePath
 */
 public void setSourcePath(String sourcePath) {
  this.sourcePath = sourcePath;
 }

 public String getTargetFileFullName() {
  return targetFileFullName;
 }
/**
 * 设置要生成的目标xml文件的名称,是绝对路径
 * @param targetFileFullName 要生成的目标xml文件的绝对路径
 */

 public void setTargetFileFullName(String targetFileFullName) {
  this.targetFileFullName = targetFileFullName;
 }

 public String getRulePath() {
  return rulePath;
 }
/**
 * 设置规则文件的绝对路径
 * @param rulePath 规则文件的绝对路径
 */
 public void setRulePath(String rulePath) {
  this.rulePath = rulePath;
 }

 public Parser() {
  super();
  // TODO Auto-generated constructor stub
 }
/**
 * 从一个文件路径里读取一个Document
 * @param fileName 文件的绝对路径
 * @return Document
 */
 private Document read(String fileName){
  SAXReader reader = new SAXReader();
  Document document = null;
  try {
   document = reader.read(new File(fileName));
   
  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  return document;
  
 }


 /**
  * 根据schema文件验证规则文件是否合法,如果合法,返回true;否则返回false.
  * @param xsdPath  schema文件的绝对路径
  * @param xmlPath  欲验证的xml文件的绝对路径
  * @return 如果xml文件符合指定的schema文件要求,返回true;否则返回false.
  */
 private boolean validateXmlByXsd(String xsdPath,String xmlPath){
  boolean isOK = false;
  File xmlFile = new File(xmlPath);
  File xsdFile = new File(xsdPath);
  if(!xmlFile.exists() || !xsdFile.exists()){
   return isOK;
  }
  SAXParserFactory factory = SAXParserFactory.newInstance();
  factory.setNamespaceAware(true);
  factory.setValidating(true);
  
  try {
   SAXParser parser = factory.newSAXParser();
   parser.setProperty(StaticConstant.SCHEMA_LANGUAGE, StaticConstant.XML_SCHEMA);
   parser.setProperty(StaticConstant.SCHEMA_SOURCE, xsdFile);
   
   XMLReader xmlReader = parser.getXMLReader();
   xmlReader.setContentHandler(new DefaultHandler());
   xmlReader.setErrorHandler(new DefaultErrorHandler());
   xmlReader.parse(xmlPath);
   isOK = true;
   
   
  } catch (ParserConfigurationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SAXException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return isOK;
 }
 /**
  * 读取规则文件和源文件生成目标文件的Document
  * @return 目标文件的Document.
  */
 private Document parseRuleXml(){
  //首先根据规则文件的schema验证规则文件是否正确,若不正确直接抛错误。
  if(validateXmlByXsd(getRuleSchemaPath(), getRulePath())){//如果验证正确
   Document rule = read(rulePath);
   Document source = read(sourcePath);
   Element ruleRoot = rule.getRootElement();
   List children = ruleRoot.selectNodes("/rule/children");
   for(int i=0,l=children.size();i<l;i++){
    Element child = (Element)children.get(i);
    if(doc == null){
     doc = DocumentHelper.createDocument();
    }
    Iterator childIt = child.elementIterator();
    XpathParser xp = new XpathParser();
    xp.setFromDocument(source);
    xp.setTargetDocument(doc);
    
    while(childIt.hasNext()){
     Element el = (Element)childIt.next();
     String text = el.getText();
     
     if(el.getName().equals("parent_from")){
      
      xp.setParentFrom(text);
      
     }else if(el.getName().equals("parent_to")){
      xp.setParentTo(text);
     }else if(el.getName().equals("from")){
      xp.setFrom(text);
     }else if(el.getName().equals("to")){
      xp.setTo(text);
     }
    }
    doc = xp.getTargetDocument();
   }
   
  } else
   try {
    throw new Exception("规则文件不符合它的schema,请重新写规则文件并用其schema做验证!");
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  return doc;
 }
/**
 * 生成目标XML文件,如果成功生成,返回true;否则返回false.
 * @return boolean
 */
 public boolean toXML(){
  boolean isOK = false;
  //创建XML文档
  OutputFormat format = OutputFormat.createPrettyPrint();
  format.setEncoding("UTF-8");
  try {
   Document doc = parseRuleXml();
   XMLWriter writer = new XMLWriter(new FileOutputStream(getTargetFileFullName()),format);
   writer.write(doc);
   writer.close();
   isOK = true;
  }  catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  return isOK;
  
 }
 
 public static void main(String[] args){
  Parser parser = new Parser();
  parser.setRuleSchemaPath("F:\\ESB\\example\\rule.xsd");
  parser.setRulePath("F:\\ESB\\example\\rule.xml");
  parser.setSourcePath("F:\\ESB\\example\\source.xml");
  parser.setTargetFileFullName("F:\\ESB\\example\\result.xml");
  if(parser.toXML()){
   System.out.println("成功生成XML!!!");
  }else{
   System.out.println("生成XML出现错误!!!");
  }
 }
}

 

/**
 * <p>
 * Title: XpathParser类
 * </p>
 * <p>
 * Description: 根据xpath读取目标文件里的数据,同时根据描述目标文件的xpath生成目标文件的Document。
 * </p>
 * <p>
 * Copyright: Copyright (c) 2009
 * </p>
 * <p>
 * 
 * </p>
 *
 *  * @version 1.0
 */
public class XpathParser {
//规则文件中源文件的父路径
 private String parentFrom;
 //规则文件中源文件本身路径
 private String from;
 //规则文件中目标文件的父路径
 private String parentTo;
 //规则文件中目标文件路径本身
 private String to;
 //源文件Document
 private Document fromDocument;
 //目标文件Document
 private Document doc;

 public String getParentFrom() {
  return parentFrom;
 }


 public void setParentFrom(String parentFrom) {
  this.parentFrom = parentFrom;
 }


 public String getFrom() {
  return from;
 }


 public void setFrom(String from) {
  this.from = from;
 }


 public String getParentTo() {
  return parentTo;
 }


 public void setParentTo(String parentTo) {
  this.parentTo = parentTo;
 }


 public String getTo() {
  return to;
 }


 public void setTo(String to) {
  this.to = to;
 }

 public void setFromDocument(Document source) {
  // TODO Auto-generated method stub
  this.fromDocument = source;
 }


 public Document getFromDocument() {
  return fromDocument;
 }


 public void setTargetDocument(Document doc) {
  // TODO Auto-generated method stub
  this.doc = doc;
 }

/**
 * 根据规则文件生成目标文件的Document
 * @return
 */
 public Document getTargetDocument() {
  // TODO Auto-generated method stub
  String parentPath = "";
  if(this.parentTo == null || this.parentTo.equals("")){
   if(this.to != null && !this.to.equals("")){
    if(this.to.startsWith(StaticConstant.SLASH)){//表示to指的是绝对路径
     parentPath = this.to;
    } else
     try {
      throw new Exception("没有父路径的情况下,此目标路径必须为绝对路径!");
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    
   } else
    try {
     throw new Exception("目标路径不能为空!");
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  }else if(this.parentTo != null){
   if(this.parentTo.startsWith(StaticConstant.SLASH)){//表示父路径xpath是绝对路径
    if(this.to != null && !this.to.equals("")){
     if(this.to.startsWith(StaticConstant.SLASH)){//表示to指的是绝对路径
      parentPath = this.to;
     }else{
      parentPath = this.parentTo.concat(StaticConstant.SLASH).concat(this.to);//表示to指的是相对路径
     }
     
    }else
     new Exception("必须要有子路径!");
   } else
    try {
     throw new Exception("父路径必须为绝对路径!");
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  }
    String[] parents = parentPath.substring(1).split(StaticConstant.SLASH);
    String temp = "";
    Element parentElement = null;
    for(int i=0,l=parents.length;i<l;i++){
     String parent = parents[i];
     
     temp += StaticConstant.SLASH + parent;
     if(this.doc.selectNodes(temp).isEmpty()){
      if(parent.indexOf(StaticConstant.LEFT_MIDDLE_BRACKET) != -1){//表示有属性
       String p[] = parent.split("\\" + StaticConstant.LEFT_MIDDLE_BRACKET);
       if(parentElement == null ){
        parentElement = this.doc.addElement(p[0]);
        
       }else{
        parentElement = parentElement.addElement(p[0]);
       }
       String attr = p[1].substring(1, p[1].length()-1);
       parentElement.addAttribute(attr.substring(0,attr.indexOf("=")), attr.substring(attr.indexOf("=")+2,attr.length()-1));
       
       
      }else{
       if(parentElement == null ){
        parentElement = this.doc.addElement(parent);
        
       }else{
        parentElement = parentElement.addElement(parent);
       }
      }
      
     }else {
      parentElement = (Element)this.doc.selectSingleNode(temp);
     }
     
     
    }
    //读源里的值
    String fromPath = "";
    if(this.parentFrom == null || this.parentFrom.equals("")){
     if(this.from != null && !this.from.equals("")){
      if(this.from.startsWith(StaticConstant.SLASH)){//表示from指的是绝对路径
       fromPath = this.from;
      }else{
       try {
        throw new Exception("没有父路径的情况下,此目标路径必须为绝对路径!");
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
      }
     } else
      try {
       throw new Exception("必须要有子路径!");
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
    }else if(this.parentFrom != null){
     if(this.parentFrom.startsWith(StaticConstant.SLASH)){//表示xpath是绝对路径
      if(this.from != null && !this.from.equals("")){
       if(this.from.startsWith(StaticConstant.SLASH)){//表示from指的是绝对路径
        fromPath = this.from;
       }else{
        fromPath = this.parentFrom.concat(StaticConstant.SLASH).concat(this.from);//表示from指的是相对路径
       }
      } else
       try {
        throw new Exception("必须要有子路径!");
       } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
     } else
      try {
       throw new Exception("父路径必须为绝对路径!");
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      
    }
    String text = this.fromDocument.selectSingleNode(fromPath).getText();
    this.doc.selectSingleNode(parentPath).setText(text);
    
  return this.doc;
 }
 
}

 

/**
 * <p>
 * Title: StaticConstant类
 * </p>
 * <p>
 * Description: 静态常量
 * </p>
 * <p>
 * Copyright: Copyright (c) 2009
 * </p>
 * <p>
 *
 * </p>
 *
 * 
 * @version 1.0
 */
public class StaticConstant {

 public static final String LEFT_BRACKET = "<";
 public static final String RIGHT_BRACKET = ">";
 public static final String SLASH = "/";
 public static final String LEFT_MIDDLE_BRACKET = "[";
 public static final String blank =" ";
 public static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
 public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
 public static final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
}

测试类

public class MainTest extends  TestCase{

 public void test(){
  Parser parser = new Parser();
  parser.setRuleSchemaPath("F:\\ESB\\example\\rule.xsd");
  parser.setRulePath("F:\\ESB\\example\\rule.xml");
  parser.setSourcePath("F:\\ESB\\example\\source.xml");
  parser.setTargetFileFullName("F:\\ESB\\example\\result.xml");
  if(parser.toXML()){
   System.out.println("成功生成XML!!!");
  }else{
   System.out.println("生成XML出现错误!!!");
  }
  
 }

}

分享到:
评论

相关推荐

    java的xml和json相互转换工具类,亲测直接用

    本篇文章将详细介绍Java中如何实现XML和JSON的相互转换,并提供一个名为`XmlToJson.java`的工具类作为参考。 首先,XML是一种结构化的数据表示方式,它以树形结构存储数据,易于人类阅读和编写,同时也易于机器解析...

    javabean和xml互相转换工具类以及jar包

    这个类可能包含静态方法,如`beanToXml(JavaBean bean)`用于将JavaBean转换为XML字符串,以及`xmlToBean(String xml)`用于将XML字符串反向转换回JavaBean。使用这样的工具类可以使代码更加简洁,提高代码复用性。 ...

    XML to JSON and JSON to XML converter

    XML-to-JSON和JSON-to-XML转换在数据交换中扮演着关键角色,尤其在Web开发中。开发者可以利用各种库和在线工具进行转换,以满足不同环境下的需求。理解这些转换原理和工具的使用,对于提高开发效率和优化数据处理...

    XMLto JSON 源码

    本项目"XMLto JSON 源码"正是为此目的设计,它提供了一个C#编写的`XmlToJson`类,能够方便地将XML字符串转换为JSON字符串。 XMLtoJSON的实现主要基于.NET Framework或.NET Core的内置类库,如System.Xml和System....

    c# XML 与实体相互转换 源代码

    public static T XmlToEntity(string xml) where T : new() { using (TextReader reader = new StringReader(xml)) { var serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(reader...

    xml/Json转换工具类

    接着,我们来看`Xml2Json.java`文件,这个工具类应该包含了XML转换为JSON的逻辑。在Jackson库中,我们可以使用`XmlMapper`类将XML对象映射为JSON。下面是一个简单的示例: ```java import ...

    java一键xml转map,一键map转xml工具类

    在实际使用`EasyXmlUtil`时,只需简单调用`xmlToMap`和`mapToXml`方法,即可完成XML和Map之间的转换。例如: ```java Map, String&gt; map = EasyXmlUtil.xmlToMap(xmlString); String xmlString = EasyXmlUtil....

    XML与DataTable相互转换

    #### 三、XML转换为`DataTable`或`DataSet` 将XML字符串转换回`DataTable`或`DataSet`也很简单,可以使用`ReadXml`方法实现。具体代码如下: ```csharp public static DataSet XmlToDataSet(string xml) { try {...

    word to pdf word xml to pdf

    将XML转换为PDF,通常涉及以下几个步骤: 1. **解析XML文件**:首先,需要读取XML文件,解析其结构和内容。 2. **转换为可渲染格式**:XML数据需要转换成像HTML或XSL-FO(Extensible Stylesheet Language ...

    xml和struct之间的相互转换

    4. **struct到XML转换**:这个过程与解析相反,需要遍历struct,为每个字段生成对应的XML标签和值。这通常涉及到递归处理嵌套的struct或数组。 5. **编码与解码**:由于XML通常是Unicode(如UTF-8)编码,而C语言的...

    xStream xml to bean

    在`beanToXml()` 方法中,同样需要初始化xStream实例,然后使用`toXML()` 方法将Bean对象转换为XML字符串: ```java public String beanToXml(YourBeanClass bean) { XStream xstream = new XStream(new DomDriver...

    xml to bean or bean to xml

    在提供的文件`ClassToXml.java`和`CC.java`中,很可能是实现了XML到Bean或Bean到XML转换的示例代码。具体实现细节需要查看源代码才能理解。通常,这些类会包含对JAXB API的调用,如创建JAXBContext、Unmarshaller和...

    从.mesh转换到.xml的过程及工具

    - **在线转换服务**:虽然目前市面上较少提供.mesh到.xml的在线转换服务,但可以考虑使用这类服务进行简单的测试或少量文件的转换。 #### 5. 总结 从.mesh文件转换为.xml文件的过程中,选择合适的工具和技术至关...

    jquery-xmlToJson.js

    在某些场景下,我们需要将XML数据转换为JSON格式,以便于JavaScript进行处理,这正是"jquery-xmlToJson.js"这个文件的作用。 "jquery-xmlToJson.js"是一个jQuery插件,它的主要功能是将XML文档或字符串转换为JSON...

    XML与数据库相互转换

    同时,.NET Framework 2.0(包含在VS2003中)引入了LINQ to XML(Language Integrated Query for XML),这是一种更直观的方式来处理XML文档,可以方便地创建、查询和修改XML。 4. **.NET中的数据绑定**: 在.NET...

    C# xmlToList xml转换成对象

    在上述两种方法中,`CreateObjectFromNode`和`ConvertXmlNodeTo&lt;T&gt;`方法需要根据实际的XML结构和要转换的类来实现。通常,这涉及到反序列化XML节点的属性或子元素到T类型的对象的属性。 总的来说,C#提供了多种方式...

    xml格式的字符串转换成List

    在.NET环境中,有XmlSerializer或LINQ to XML等工具。 2. **创建数据模型**:为了存储解析后的数据,我们需要定义一个与XML元素相对应的数据结构。比如,对于上述示例,我们可以创建一个`Item`类: ```java ...

    xmlto-0.0.28.tar.gz

    这个压缩包“xmlto-0.0.28.tar.gz”是一个在Linux或类Unix系统中常见的源码包,它使用gzip压缩算法,通过tar命令进行打包,通常用于分发开源软件的源代码。 在解压这个文件后,我们通常会得到一个名为“xmlto-0.0....

    java实现xmlToJson

    在这种情况下,Jackson库能够很好地处理这些复杂性,自动将XML转换为对应的JSON结构。此外,你还可以自定义序列化和反序列化过程,以满足特定的需求。 标签“XML/JSON”表明这个话题涉及两个主要的数据格式,XML和...

    java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类

    这个技术使得开发者可以方便地将XML数据转换为Java对象,反之亦然。在给定的压缩包文件中,可能包含了实现这一功能的相关代码示例,包括XML文件、数据传输对象(DTO,Data Transfer Object)以及一个用于读取文件的...

Global site tag (gtag.js) - Google Analytics