以前接触过一点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 ,建议使用中文版的,那些专业的词汇真的有点看不明白。
目前能做的也只能是生成解析这一种格式的,还差得太远了。
路漫漫长,上下而求索吧。