快捷导航

xml文件怎么打开(xml文件的解析)

[复制链接]
查看: 1006|回复: 0

8万

主题

8万

帖子

26万

积分

论坛元老

Rank: 8Rank: 8

积分
260116
发表于 2020-11-14 00:00:00 | 显示全部楼层 |阅读模式
  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();//关掉流

  }

  }

  

(责任编辑:网络)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩推荐

让创业更简单

  • 反馈建议:XXXXXXXX
  • 客服电话:暂时没有
  • 工作时间:周一到周五9点~22点

云服务支持

黑客联盟,快速搜索

关注我们

Copyright 黑客论坛  Powered by©  技术支持: