XML解析

XMLViewer xml查看器 XMLViewer,查看xml文件非常好用的工具。 Viewer(xml查看器)是一款专业的xml查看软件。他可以帮助用户方便查看xml,以便检测语法是否正确。 安装之后,右键点击XML文件,选择“ View ”,方便快捷。 立即下载

一、了解XML

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性
XML 与 HTML 的主要差异
  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息。

二、常用的解析XML的技术

  • A:DOM(Document Object Model):

    在内存中构建一颗倒挂的树,通过对内存中的节点进行操作从而解析XML缺点:由于需要根据XML文档构造倒挂的树,所以当XML文档比较大时,非常耗内存。有造成内存溢出的危险。不适合移动设备的开发.

  • B:SAX(Simple API For Xml):

    基于事件驱动的方式解析XML(推模式PUSH)

  • C:JDOM:

    对DOM模型的简化,专门针对Java语言解析XML而设计的

  • D:DOM4J:
    融入了XPath语法等,是目前解析XML功能最强大的一门技术

  • E:PULL:
    基于事件驱动的方式解析XML.(拉模式(PULL))

三、使用DOM技术解析Xml

DOM技术是JDK自带的技术,使用时不需要导入第三方jar包

1.实例化DOM解析器工厂对象

DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();

2.根据DOM解析器工厂对象得到DOM解析器对象

DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();

3.指定要解析的Xml文件在哪里并发放文档对象

Document document= documentBuilder.parse(inputStream);

4.根据文档对象得到根节点对象

Element root= document.getDocumentElement();

5.根据标签名获取指定节点的集合存储到NodeList对象中

NodeList book_nodeList= root.getElementsByTagName("标签名");
int len=book_nodeList.getLength();//获取集合中节点的个数
for(int i=0;i<len;i++){
    Node book_node=book_nodeList.item(i);
    //为了使用Element特有的方法:String getAttribute(String name)根据属性名获取属性值的功能
    Element book_element=(Element) book_node;
    String isbn=book_element.getAttribute("isbn");
    //getTextContent():获取当前节点的文本内容
    String name=book_element.getElementsByTagName("name").item(0).getTextContent();
    String author=book_element.getElementsByTagName("author").item(0).getTextContent();
    String price=book_element.getElementsByTagName("price").item(0).getTextContent();
    String publish=book_element.getElementsByTagName("publish").item(0).getTextContent();
    Book book=new Book(isbn,name,author,Double.parseDouble(price),publish);
    books.add(book);
}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book isbn="001">
        <name>Java</name>
        <author>孙鑫</author>
        <price>56.7</price>
        <publish>人民出版社</publish>
    </book>
    <book isbn="002">
        <name>Android</name>
        <author>安迪鲁宾</author>
        <price>76.7</price>
        <publish>邮电出版社</publish>
    </book>
    <book isbn="003">
        <name>iOS</name>
        <author>乔布斯</author>
        <price>56.7</price>
        <publish>清华出版社</publish>
    </book>
</books>

将给定的Xml文件做相关修改后生成新的Xml文件

public class DOMGenerateXmlDemo02 {
    public static void main(String[] args) {
        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
        1.实例化转换工厂对象
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
        InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");
        Document doc=documentBuilder.parse(inputStream);
        Element element_root=doc.getDocumentElement();
        2.通过转化工厂对象得到转换器对象
        Transformer transformer= transformerFactory.newTransformer();
        3.设置输出属性,文档进行缩进
        transformer.setOutputProperty("indent","yes");
        4.实例化DOMSource对象
        DOMSource domSource=new DOMSource();
        domSource.setNode(doc);
        Element element_book=doc.createElement("book");
        element_book.setAttribute("isbn","400");
        Element element_name=doc.createElement("name");
        element_name.setTextContent("小丽");
        element_book.appendChild(element_name);
        element_root.appendChild(element_book);
        //实例化流结果对象
        StreamResult streamResult=new StreamResult();
        //指定流结果对象关联的输出流对象
        streamResult.setOutputStream(new FileOutputStream("hsj.xml"));
        //将内存中的树结构生成指定的文件
        transformer.transform(domSource, streamResult);
    }
}

根据数据源中的数据生产Xml文档

public class DOMGenerateXmlDemo03 { 
    public static void main(String[] args) {
        List<Book> books=new ArrayList<Book>();
        books.add(new Book("100", "Java", "孙鑫", 45.6, "人民出版社"));
        books.add(new Book("200", "Android", "安迪鲁宾", 55.6, "邮电出版社"));
        books.add(new Book("300", "iOS", "乔布斯", 65.6, "清华出版社"));
        //1.得到DOM解析器工厂对象
        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
        //2.得到DOM解析器对象
        DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
        //3.使用解析器对象得到文档对象
        Document document=documentBuilder.newDocument();
        //4.根据文档对象创建元素对象
        Element element_root=document.createElement("books");
        //5.将根节点对象挂载到文档对象上
        document.appendChild(element_root);
        //构建Xml文件
        for(Book book:books){
            //创建子节点book
            Element element_book=document.createElement("book");
            element_book.setAttribute("isbn", book.getIsbn());
            //将book节点挂载到books节点上
            element_root.appendChild(element_book);
            //创建子节点name
            Element element_name=document.createElement("name");
            element_name.setTextContent(book.getName());
            //将name节点挂载到book节点上
            element_book.appendChild(element_name);
            //创建子节点author
            Element element_author=document.createElement("author");
            element_author.setTextContent(book.getAuthor());
            //将author节点挂载到book节点上
            element_book.appendChild(element_author);
            //创建子节点price
            Element element_price=document.createElement("price");
            element_price.setTextContent(String.valueOf(book.getPrice()));
            //将price节点挂载到book节点上
            element_book.appendChild(element_price);
            //创建子节点publish
            Element element_publish=document.createElement("publish");
            element_publish.setTextContent(book.getPublish());
            //将publish节点挂载到book节点上
            element_book.appendChild(element_publish);
        }
         
        //将内存中构建的倒挂的树生成本地的Xml文件
        
        //1.得到转换器工厂对象
        TransformerFactory transformerFactory=TransformerFactory.newInstance();
        //2.根据转换器工厂对象得到转换器对象
        Transformer transformer=transformerFactory.newTransformer();
        //3.设置输出属性,文档进行缩进
        transformer.setOutputProperty("indent","yes");
        //4.准备DOMSouce对象
        DOMSource domSource=new DOMSource(document);
        //5.准备Result对象
        /*StringWriter stringWriter=new StringWriter();
        StreamResult streamResult=new StreamResult(stringWriter);*/
        File destFile=new File("hsj.xml");
        StreamResult streamResult=new StreamResult(destFile);
        //6.执行转换操作生成xml字符串
        transformer.transform(domSource, streamResult);
        //System.out.println(stringWriter);
        System.out.println("Xml文件生成成功!");
    }
 
}

四、SAX解析

1.得到SAX解析器工厂对象

SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();

2.通过SAX解析器工厂对象得到SAX解析器对象

SAXParser saxParser= saxParserFactory.newSAXParser();

3.通过解析器对象得到Xml的阅读器对象

XMLReader xmlReader= saxParser.getXMLReader();

4.通过Xml的阅读器对象开启命名空间特性功能

xmlReader.setFeature("http://xml.org/sax/features/namespaces", true);

5.指定要解析的Xml文件在哪里并且指定解析器(解析给定的Xml)对象

InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");
saxParser.parse(inputStream, new MyHandler());

5.在解析器中解析Xml即可
自定义SAX处理器是可以继承DefaultHandler类或者实现ContentHandler接口

要想解析Xml文件一般都会重写如下方法:

  • startDocument():在开始解析Xml文档前自动调用的方法,做初始化工作,只调用一次
  • startElement():遇到Xml的开始标签时自动调用的方法,看遇到多少个开始标签就调用多少次
  • characters():遇到文本元素(汉字,空白(空格,tab,回车等))时自动调用的方法,看xml文档中有多少文本元素
  • endElement():遇到Xml的结束标签时自动调用的方法,看遇到多少个结束标签就调用多少次
  • endDocument():在解析完毕Xml文档后自动调用的方法,做资源释放工作,只调用一次
private final static class MyHandler extends DefaultHandler{
     声明存放Book对象的集合
    private List<Book> books;
     声明书对象,用来存储解析出来的数据 
    private Book book;
     记录当前解析对象的父节点对象
    private String parent;
     收到开始解析Xml文档的通知时自动调用的方法,只调用一次
    @Override
    public void startDocument() throws SAXException {
        this.books=new ArrayList<Book>();
    }
    /**
     * 收到遇到开始标签的通知时自动调用的方法
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //记录当前节点的标签名
        this.parent=qName;
        if("book".equals(qName)){
            //根据属性名得到属性值
            String isbn=attributes.getValue("isbn");
            book=new Book();
            book.setIsbn(isbn);
        }
    }
    /**
     * 收到遇到元素字符数据时自动调用的方法
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String data=new String(ch,start,length);
        if("name".equals(this.parent)){
            this.book.setName(data);
            }else if("author".equals(this.parent)){
            this.book.setAuthor(data);
            }else if("price".equals(this.parent)){
            this.book.setPrice(Double.parseDouble(data));
            }else if("publish".equals(this.parent)){
            this.book.setPublish(data);
        }
    }
    /**
     * 收到遇到元素结束标签时自动调用的方法
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        //遇到结束标签将之前的开始标签内容置空
        this.parent=null;
        if("book".equals(qName)){
            this.books.add(book);
        }
    }
    /**
     * 收到文档结束完毕的通知后自动调用的方法,只调用一次.
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("books="+books);
    } 
}

五、Pull解析

1.得到Pull解析器工厂对象

XmlPullParserFactory xmlPullParserFactory=XmlPullParserFactory.newInstance();

2.过Pull解析器工厂对象得到Pull解析器对象

XmlPullParser xmlPullParser= xmlPullParserFactory.newPullParser();

3.指定要解析的Xml文件在哪里同时指定编码表

InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("books.xml");
xmlPullParser.setInput(inputStream, "utf-8");

4.得到事件对象值

int eventType=xmlPullParser.getEventType();

5.只要没有解析到Xml的结尾则继续继续

while(eventType!=XmlPullParser.END_DOCUMENT){
    switch (eventType) {
        //XmlPullParser.START_DOCUMENT=0
        case XmlPullParser.START_DOCUMENT://开始解析Xml文档时返回的事件值
        break;
        
        //XmlPullParser.START_TAG=2
        case XmlPullParser.START_TAG://遇到开始标签时返回的事件值
            String startTag=xmlPullParser.getName();//得到当前解析节点的标签名
        break;
        
        //XmlPullParser.TEXT=4
        case XmlPullParser.TEXT://遇到字符数据时返回的事件值
            String text=xmlPullParser.getText();//得到当前的文本内容
        break;
        
        //XmlPullParser.END_TAG=3
        
        case XmlPullParser.END_TAG://遇到结束标签时返回的事件值
            String endTag=xmlPullParser.getName();//得到当前解析节点的标签名
        break;
    }
    String startTag=xmlPullParser.getName();//得到当前解析节点的标签名
    String isbn=xmlPullParser.getAttributeValue(null, "isbn");//根据属性名获取属性值
    String publish=xmlPullParser.nextText();//得到当前节点的文本内容
 	//将事件流继续向下推动
    eventType=xmlPullParser.next();
}
将AAL图谱对应到Yeo7大网络中【原理,代码分析】 本文介绍了将AAL2图谱映射到Yeo7大功能网络的方法。通过整合皮层(Yeo2011)、小脑(Buckner2011)和纹状体(Choi2012)三个区域的功能网络图谱,采用投票机制确定每个AAL区域的网络归属。具体步骤包括:1)统计每个AAL区域体素在各网络图谱中的分布;2)选择体素数量最多的网络作为该区域的最终标签。该方法实现了从解剖结构到功能网络的映射,可获得120个AAL区域对应的7大功能网络标签。 阅读详情

相关推荐

手把手教你用Python处理MAHNOB-HCI多模态数据集(含脑电EEG/眼动/视频数据同步实战)

本文详细介绍了如何使用Python处理MAHNOB-HCI多模态数据集,涵盖脑电(EEG)、眼动追踪和视频数据的同步解析与对齐。通过MNE-Python、pandas和OpenCV等工具,实现从BDF、TSV到XML格式的高效处理,解决时间轴对齐难题,助力情感计算与人机交互研究。

weixin_30998797的博客 367

Xml解析 - XmlPullParser解析示例分析

Xml解析 - XmlPullParser解析示例分析 XmlPullParser是一种事件驱动的XML文件解析方式。由于Android系统已经集成了该部分,且Android framework中有关XML文件的解析的部分,基本都是使用这种方式去处理的;所以,我们有必要学习、了解XmlPullParser的解析过程及使用方法,以便我们阅读Android源码或在工作中使用。 XmlPull...

To be or not to be, it's a question 6285

从数据手册到代码:一步步解读SC7A20寄存器配置与加速度值换算原理

本文详细解析了SC7A20三轴加速度传感器的寄存器配置与加速度值换算原理。从数据手册出发,逐步拆解关键寄存器设置,并推导原始ADC值到物理加速度的完整换算过程,帮助开发者深入理解传感器底层工作原理,提升嵌入式开发效率。

weixin_29179311的博客 366

XMLTag详解

无论是XMLAttribute还是XMLTag类,都有OSQueueElem fElem成员变量。该变量在构造函数中fElem = this,默认调用了OSQueueElem的构造函数:使得fEnclosingObject指向this。也就是说,XMLAttribute中的fElem::fEnclosingObject指向XMLAttribute,XMLTag中的fElem::fEnclosing

sunxiaopengsun的专栏 5055

深入介绍 SAP OData CSRF Token 的一些技术细节

跨站请求伪造(Cross-Site Request Forgery,简称 CSRF)是一种网络攻击手段,它允许攻击者伪造用户的身份来执行未经授权的操作。为了防止 CSRF 攻击,常用的一种技术手段就是 CSRF Token.CSRF Token 是一种随机生成的防伪 Token,它由服务器颁发给客户端,并需要客户端在提交某些特定类型的请求时,将该 Token 添加到 HTTP 请求的头部字段去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 642

手把手教您同花顺如何设置大盘分时均价线

本文将手把手教你如何在同花顺PC端开启大盘指数分时图📈

XiaoqiangClub的博客 4388

XMLPULL源码解读记录 方法解读parseEndTag

a、解析过程中遇到&lt;/字符,进入endTag解析。 b、代码详解 public int parseEndTag() throws XmlPullParserException, IOException { //ASSUMPTION ch is past "&lt;/" // [42] ETag ::= '&lt;/' Name S? '&g...

技术回归 507

C++大牛的博客

1. C++大牛的博客     Bjarne Stroustrup的博客: Bjarne Stroustrup’s Homepage Bjarne Stroustrup,不认识的可以去面壁了,没有他,就没有我们现在的饭碗。Bjarne Stroustrup是丹麦人,目前任教于TAMU。他的Homepage和他的书籍The C++ Programming Language一样

程序猿老樊的博客 6244

Android中基于XmlPullParser和DocumentBuilderFactory的XML解析 记录

记录基于XmlPullParser的xml解析过程,结合日志观看理解更深刻

XJ200012的博客 1499

RT-DETR的AIF模块+YOLOv8:融合注意力与特征交互,打造实时检测的科研级进阶方案

从理解AIF模块“细粒度注意力+跨尺度交互”的核心设计,到亲手将其嵌入YOLOv8并验证在复杂场景的表现,再到基于此探索属于自己的科研与工程方向——这个过程能让你深刻理解“注意力机制与CNN融合”在实时检测中的核心价值。现在就开始行动,相信你会在实时目标检测的“智能进化”之路上,走出一条属于自己的技术路径。从实验对比图可见,集成AIF模块的YOLOv8,其mAP(平均精度)在多个阈值下均有提升,尤其是mAP50-95(高IoU阈值下的精度)提升更为显著,充分证明了AIF对细粒度特征的捕捉能力。

m0_64661770的博客 188

Uncaught ReferenceError: process is not defined

这个错误 Uncaught ReferenceError: process is not defined 通常出现在浏览器环境中,因为 process 是 Node.js 环境的内置对象,并不是浏览器原生支持的。因此,浏览器无法识别 process,导致该错误。在App.vue中加上以下代码就能够有效解决。

猿小白的博客 1740

XML简介

XML(Extensible Markup Lanaguage),可扩展标记语言,是标准通用标记语言(Standard Generalized Markup Language, SGML)的一个子集,SGML功能强大,是可以定义标记语言的元语言。将强大的SGML的通用性和HTML的易用性结合起来便诞生了适合在Web中应用的XML语言。 1、起源 1998年2月W3C(万维网联盟)发布了XML1

水逝流年 1719

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++解析XML文件

C++读取XML文件

StarWang的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

什么是xml解析?xml解析的有几种常用的解析方式?

SAX解析只能查询,不能实现增删方法,不常用,这里就不过得介绍了

superliug的博客 6125

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python解析xml

你需要。

weixin_45365818的博客 4882

XML解析——Java中XML的四种解析方式

XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。   XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台。   针对以下XML文件,会对四种方式进行详细描述: <?xml version="1.0

qq_37272886的博客 4202

Python XML 解析

XML 指可扩展标记语言(eXtensibleMarkupLanguage)。你可以通过本站学习XML 教程XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。Python 对 XML 的解析常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。characters(content)方法。

qq_48368964的博客 1934

XML解析(一),SAX解析XML

一、概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOC解析,PULL解析(Android特有),SAX与DOC不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点,对于Android等CPU资源宝贵的移动平台来说是一个巨大的优势。 SAX的优点:解析速

宿罪的博客 3万+

XML 解析

一、五种解析方法 1、DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准【优点】 ①允许应用程序对数据和结构做出更改。 ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。【缺点】 ①通常需要加载整个XML文档来构造层次结构,消耗资源大。【解析详解】 ①构建Document对象: DocumentBuild...

qq_30436011的博客 5042

perl 解析xml_使用Perl的高级XML解析技术

对于种类繁多的Perl应用程序,选择的XML工具是XML::Simple ,这是本系列第1部分的主题(请参阅参考资料 )。 XML::Simple将XML输入文件转换为易于操作的Perl数据结构,并将这些数据结构写回XML。 但是请记住,这种方法在某些情况下不起作用。 当您需要在内存中构建XML文档的表示形式,然后以相当复杂或不可预测的方式搜索或转换XML文档时, XML::Simple并...

cuyi7076的博客 2289

php怎么解析xml,php解析xml方法实例详解

本文以实例形式详细讲述了php解析xml方法。分享给大家供大家参考。具体分析如下:books.xml文件如下:Harry PotterJ K. Rowling200529.99Everyday ItalianGiada De Laurentiis200530.00Learning XMLErik T. Ray200339.951、DOM解析XML//创建一个DOMDocument对象$doc=ne...

weixin_34135180的博客 2823

XML篇之XML解析

什么是xml解析XML 解析是指对 XML 文档进行解析,从而获取文档中的数据信息的过程。XML(Extensible Markup Language)是一种用于存储和传输数据的标记语言。它和 HTML 相似,都是用标签来描述文档内容,但 XML 更加灵活和扩展,适用于存储和传输各种结构化数据。常见的 XML 应用包括 RSS、SOAP、Atom、SVG 等。XML 解析器是用于对 XML 文档进行解析的程序。XML 解析的方式一般有两种:DOM 解析和 SAX 解析。

m0_73329959的博客 2164
上一篇: (七)Android基础系列之:BroadcastReceiver
下一篇: Java反射
azhoufeng
博客等级 码龄10年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值