xml文件怎么打开(xml文件的解析)
xml文件如何打开(xml文件的分析)1. 分析方法
1. 有二种分析方法,分别是:
DOM:即Document Object Model,文本文档领域模型,W3C发布的专业用以解析xml一种处理方法
SAX:Simple API for XML,一个开源项目发布的xml解析方法。
差别是:
DOM方法会将全部xml文件分析变成一个树形结构构造,并载入到运行内存中,这类方法有一个缺陷,假如xml文档过大,则分析会十分迟缓,乃至会造成内存溢出,优势便是由于在运行内存中形成了一个树形结构构造,因此 能够对随意连接点原素开展删改改实际操作。
SAX方法则是一边读一边分析,读到哪个连接点原素就分析哪个,根据量化策略,优势便是查看速度更快并且不容易产生内存溢出,缺陷便是没法开展删改改实际操作。
2. xml解析开发包:这三个解析包均适用DOM和SAX二种方法解析xml文档
JAXP:由sun公司发布的解析包,是JavaSE中的一部分,有下列好多个包以及子包组成
Dom4J:由一个开源系统机构开发设计的分析完成包,常见这一包开展XML文档分析。
JDom:也是一个开源系统机构开发设计的解析包
2. 根据JDK中的在线解析以DOM方法开展XML文档分析的完成编码
1. 基本完成
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo1 {
public static void main(String[] args) {
try {
//1. 获得在线解析的工程类专业目标DocumentBuilderFactory
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
//2. 根据加工厂类获得DOM在线解析目标
DocumentBuilder docb=domfac.newDocumentBuilder();
//3. 分析特定途径的xml文件,并回到一个Document目标,Document目标中储存着全部xml文件中全部的原素连接点
Document doc=docb.parse("url");
//4. 根据连接点原素的名字来获得连接点原素,回到的是一个NodeList目标
NodeList list=doc.getElementsByTagName("name");
//5. 从NodeList目标中解析xml获得连接点原素Node目标
for(int i=0;i
Node node=list.item(i);
//6. 根据Node目标来获得连接点内的实际信息内容,或是开展删改改当今连接点及子连接点实际操作
System.out.println(node.getTextContent());;//获得当今连接点中的文字数据信息
}
} 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();
}
}
}
2. 加上子连接点和删掉子连接点
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo2 {
public static void main(String[] args) {
try {
//1. 获得在线解析的工程类专业目标DocumentBuilderFactory
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
//2. 根据加工厂类获得DOM在线解析目标
DocumentBuilder docb=domfac.newDocumentBuilder();
//3. 分析特定途径的xml文件,并回到一个Document目标,Document目标中储存着全部xml文件中全部的原素连接点
Document doc=docb.parse("url");
//4. 建立连接点原素目标,并加上文字內容
Element e=doc.createElement("连接点原素名字");
e.setTextContent("文字內容");
//5. 根据连接点原素的名字来获得连接点原素,回到的是一个NodeList目标
NodeList list=doc.getElementsByTagName("name");
//6. 从NodeList目标中解析xml获得连接点原素Node目标
for(int i=0;i
Node node=list.item(i);
//7. 根据Node目标来获得连接点内的实际信息内容,或是开展删改改当今连接点及子连接点实际操作
System.out.println(node.getTextContent());;//获得当今连接点中的文字数据信息
//8. 加上子连接点
node.appendChild(e);
//删除当前连接点
}
} 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();
}
}
}
3. Document目标中数据的回写:当对xml文件分析成Document目标后,对Document目标开展改动后,必须回写到xml文件
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo3 {
public static void main(String[] args) {
try {
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
DocumentBuilder docb=domfac.newDocumentBuilder();
Document doc=docb.parse("url");
NodeList list=doc.getElementsByTagName("name");
//开展删改改改动原素连接点,随后回写,例如改动某一连接点的文字內容
list.item(0).setTextContent("新文字內容");
//最先获得javax.xml.transform.Transformer类
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer trans=transformerFactory.newTransformer();
//关联要回写的Document目标
DOMSource doms=new DOMSource(doc);
//特定要回写到哪一个xml文件中,主要参数写系统软件绝对路径或相对性于当今类文档的相对路径
//或是是一个File种类的目标,还可以是一个輸出流目标
StreamResult sr=new StreamResult("url");
//开展回写
trans.transform(doms, sr);
} 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();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 对解析xml文档形成Document目标及其将Document目标开展回写封裝能够变成一个工具类:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
public class MyDomUtil {
//获得分析特定xml文件获得的Document目标
public static Document readDocument(String url) throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
DocumentBuilder docb=domfac.newDocumentBuilder();
Document doc=docb.parse(url);
return doc;
}
//向硬盘中的文档回写Document目标中的数据信息,url特定文档所属的途径,doc特定要回写的Document目标
public static void writeDocument(String url,Document doc) throws TransformerException{
TransformerFactory fac=TransformerFactory.newInstance();
Transformer trans=fac.newTransformer();
DOMSource dom=new DOMSource(doc);
StreamResult sr=new StreamResult(url);
trans.transform(dom, sr);
}
}
3. 根据JDK中的在线解析以SAX方法开展XML文档分析的完成编码
1. SAX基本原理:SAX选用事故处理的方法分析XML文档,主要是2个一部分开展分析,分别是在线解析和事件CPU。
在建立在线解析时,必须关联一个恶性事件CPU,该恶性事件CPU类中的方式是对每一个标识开展解决的逻辑性
在线解析每看到XML文档中某一标识的某一部分,都是会启用恶性事件CPU类中的某一个相匹配分析该一部分的方式开展解决,将标识该一部分的数据信息做为主要参数传到方式中,随后根据方式中的逻辑性开展解决。
恶性事件CPU由能够应用默认设置的org.xml.sax.helpers.DefaultHandler类,但假如要完成自身的解决逻辑性,就务必承继此类,随后调用在其中的一部分方式来完成自身的逻辑性,获得标签数据并对数据信息开展解决。
留意,SAX方法解析xml文档不可以对标识原素开展删改改实际操作,只有查看。
2. 编码完成:
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Demo4 {
public static void main(String[] args) {
try {
//获得在线解析
SAXParserFactory fac=SAXParserFactory.newInstance();//在线解析加工厂
SAXParser saxp=fac.newSAXParser();//在线解析
//分析XML文档,针对恶性事件CPU必须由自身设计方案完成
saxp.parse("url", new MyHandler());
} 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();
}
}
}
class MyHandler extends DefaultHandler{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 在这里完成自身的解决逻辑性
System.out.println(qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// 在这里完成自身的解决逻辑性
System.out.println(new String(ch));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// 在这里完成自身的解决逻辑性
System.out.println(qName);
}
}
4. 根据Dom4J包来完成对XML文档的分析
最先,务必导进dom4j的包才可以应用
1.分析:
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo1 {
public static void main(String[] args) {
try {
//获得在线解析目标SAXReader,SAXReader是Dom4J库中SAX方法分析XML文档的类
SAXReader sax=new SAXReader();
//分析特定途径下的xml文件,获得该xml文件的Document目标
Document doc=sax.read("url");
//获得根节点,务必先获得根节点以后才可以开展事后子标识的分析解决
//Dom4J中解析xml文档,获得标识连接点时,务必一层一层的获得,换句话说,务必先获得父节点,随后才算是子连接点
Element root=doc.getRootElement();
//获得子连接点,并开展分析
List list1=root.elements();//获得root连接点下全部的立即子连接点,并以结合方式回到
List list2=root.elements("name");//获得root连接点下全部的立即子连接点中特定名字的连接点,并以结合方式回到
Element e=root.element("name");//获得root连接点下全部的立即子连接点中特定名字的第一个连接点
String text=e.getText();//获得标识连接点內容
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2. 完成连接点原素的删改改:
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Demo2 {
public static void main(String[] args) throws Exception {
//获得在线解析目标
SAXReader reader=new SAXReader();
//分析获得XML文档的Document目标
Document doc=reader.read("url");
//获得根节点
Element root=doc.getRootElement();
//获得要改动的连接点,在这个连接点下加上一个子连接点
Element e=root.element("name");
Element child=e.addElement("childname");//在这个连接点下加上一个名叫childname的子连接点并回到这一子连接点
//设定文字內容
child.setText("xxx");
//回写,应用专用型的一个流XMLWriter
OutputFormat format=OutputFormat.createPrettyPrint();//假如应用此类,则輸出到文档之后,会出现两端对齐空格符
format.setEncoding("utf-8");//设定文档编号
XMLWriter writer=new XMLWriter(new FileOutputStream("总体目标文件路径"),format);
writer.write(doc);
writer.close();//关掉流
}
}
(责任编辑:网络)