XML生成和解析

以前接触过一点XML方面的知识,只能说是了解吧

最近写了一点这方面的代码,感觉这东西太灵活了,要真得运用自如还真难

 

生成代码

import java.io.StringWriter;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

public class XMLOutput {
	private Document doc = null;
	
/*参数 parentElementName  类型:String ; 注释:根元素下的子元素的名字(子元素可有多个,名字都相同)。
 * 参数String childElements 类型:String[]; 注释:子元素下面的所有子元素的名称(子元素下面的子元素有多个,名字不相同)。
 * 参数 childValues 类型:List ,里面的元素是String[]类型; 注释:List中的一个元素对应于一个子元素下面的所有子元素的值。
*/
	public String initElement(String parentElementName, String childElements[],
			List childValues) {
		try {
			DocumentBuilderFactory builderFactory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = builderFactory.newDocumentBuilder();
			doc = builder.newDocument();
			//建立根元素
			Element rootElement = doc.createElement("Data");
			rootElement.setAttribute("xmlns",
					"http://www.test.com.cn/test/service/test");
			rootElement.setAttribute("xmlns:xsi",
					"http://www.w3.org/2001/XMLSchema-instance");
			//外层循环是根据childValues的大小来确定有多少个子元素
			for (int i = 0; i < childValues.size(); i++) {
				//创建子元素
				Element parentElement = doc.createElement(parentElementName);
				//将子元素下所有子元素的值取出
				String values[] = (String[]) childValues.get(i);
				//如果子元素下的子元素个数和元素值个数相等,将值赋给子元素下的所有子元素
				if (childElements.length == values.length) {
					for (int j = 0; j < childElements.length; j++) {
						Element childElement = doc
								.createElement(childElements[j]);
						childElement.setTextContent(values[j]);
						//将子元素下的子元素加入到子元素中
						parentElement.appendChild(childElement);
					}
				} else {
					System.out.println("在第" + (i + 1) + "个" + parentElementName
							+ "中子子元素和子元素值个数不相等");
					continue;
				}
				//将子元素加入到根元素
				rootElement.appendChild(parentElement);
			}

			doc.appendChild(rootElement);

		} catch (Exception e) {
			System.out.println(e);
		}
		//返回生成的XML字符串
		return this.getReportDoResult();

	}


	public String getReportDoResult() {
		try {

			OutputFormat format = new OutputFormat(doc);
			format.setEncoding("GB2312");
			StringWriter stringOut = new StringWriter();
			XMLSerializer serial = new XMLSerializer(stringOut, format);
			serial.asDOMSerializer();
			serial.serialize(doc.getDocumentElement());
			return stringOut.toString();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(e);
		}
		return "";
	}

}

 

生成的XML文件

 

<?xml version="1.0" encoding="GB2312"?>
<Data xmlns="http://www.test.com.cn/test/service/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Item>
<SFLSH>1</SFLSH><SQH>2</SQH><HH>3</HH><HM>4</HM><SFXM>5</SFXM><SFJE>6</SFJE>
</Item>
<Item><SFLSH>7</SFLSH><SQH>8</SQH><HH>9</HH><HM>10</HM><SFXM>11</SFXM><SFJE>12</SFJE>
</Item>
</Data>

 

 

 

 

解析代码

import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLParse {
	/*
	 * 参数 filePath  类型 String ; 注释:XML文件绝对路径名。
	 * 参数 parentElementName 类型 String ; 注释:根元素下的子元素的名字(子元素有多个,名字都相同)。
	 * 参数 childElements 类型 List ; 注释:子元素下的所有子元素的名字(子元素下的所有子元素的名字不行同)。
	 */
	public void parse(String filePath,String parentElementName,List childElements){
		DocumentBuilderFactory factory = null;
		factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder builder = null;
		Document doc = null;
		
			try {
				builder = factory.newDocumentBuilder();
				doc = builder.parse(filePath);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}			
		NodeList nl = null;
		//读取根元素里面的子元素,子元素可能有多个
		nl = doc.getElementsByTagName(parentElementName);
		//循环输出每个子元素下的子元素的名字和值
		for (int i = 0; i < nl.getLength(); i++) {
			Element e = (Element) nl.item(i);
			//得到子元素下的子元素的值
			for(int j=0;j<childElements.size();j++){
				
				System.out.println(childElements.get(j)+":"
						+ e.getElementsByTagName(childElements.get(j)+"").item(0).getTextContent());
			}
			System.out.println("--------------");
		}
	}


	

}

 

 

还有XML的专业工具XMLSpy  ,建议使用中文版的,那些专业的词汇真的有点看不明白。

目前能做的也只能是生成解析这一种格式的,还差得太远了。

路漫漫长,上下而求索吧。

你可能感兴趣的:(apache,xml,J#,sun)