浅出Java 的Xml编程

【Java编程】SAX XML Parser解析、生成XML文件 1、优缺点 优点: SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询 阅读详情

浅出Java 的Xml编程

作者:何双江(yarshray)

对于Xml,我的认识是,一个用来存放数据的标准格式.怎么看我都觉得XML和Html,完全不一样,也许仅仅只是都使用了标记来作为文档解释的原因吧.所以人们才喜欢把XML和HTML对比来看.对于我个人而言,XML就是一个简单方便的数据文件.因为.它不同与一般的关系型数据库,把数据看出二维表.通过基本的关系运算,获取二维表中的数据.XML仅仅把数据当成一个文档,然后正对文档解析获取数据.所以我的看法是,要操作XML文档,只要一个能够解释XML的文档解释器就可以了.然后把解释的内容.转变成程序所需要的数据就可以了.当操作完毕也可以把数据写回去.因此,这里主要介绍两中XML文档解释器,和java相关的Api.它们分别是DOM和SAX.及JDOM.

为了方便起见,我们需要一个简单的XML作为本文的示例参考:这个XML的主要目的是为了存放我的书籍信息.包括书名,书的作者,书的价格,书的编号.几个基本信息,

XML示例如下:

<?xml version="1.0" encoding="gb2312"?>

<Books>

<Book id="1">

<bookName>

编程珠玑

</bookName>

<bookAuthor>

Jon Bentley

</bookAuthor>

<bookISBN>

7-5083-1914-1

</bookISBN>

<bookPrice>

28.0

</bookPrice>

</Book>

<Book id="2">

<bookName>

Java编程思想(第2版)

</bookName>

<bookAuthor>

Bruce Eckel

</bookAuthor>

<bookISBN>

7-111-10441-2

</bookISBN>

<bookPrice>

99.0

</bookPrice>

</Book>

<Book id="3">

<bookName>

Inside VCL(深入核心VCL架构剖析)

</bookName>

<bookAuthor>

李维

</bookAuthor>

<bookISBN>

7-5053-9489-4

</bookISBN>

<bookPrice>

80.0

</bookPrice>

</Book>

</Books>

该XML记录了三本书和其相关的信息.

大体上操作XML文档可以分为三个步骤.

1.创建XML解释器

2.通过XML解释器和XML文件建立关联

3.通过XML解释器解释XML标记

XML解释器的类型.基本上可以分为:

? 验证和非验证解析器

? 支持一种或多种 XML Schema 语言的解析器

? 支持 Document Object Model (DOM) 的解析器

? 支持 Simple API for XML (SAX) 的解析器

这里主要介绍后两种.解释器.

Document Object Model(DOM)解释器:

Dom解释器是由W3C官方制定的标准解释器Api.只要符合该标准的编程接口都可以用来操作XML.目前该解释器主要有三个级别.Level1 Level2 Level3 这里只讨论到Level2.Dom模型实际上是把XML文件中的数据转变成了内存中的一颗树.该树大体有Doument Note NodeList Element这些对象构成.而Dom则是负责分析这颗树的结构,然后通过解释树从而起到了解释XML文档的作用.这里值得注意的是由于操作的树型结构.所以对于有些情况该解释器是无法分清楚的.例如属性值:

Id="1"

Id=

"1"

Id='1'

这对于Dom而言是完全相同的.因为.对于文档的格式Dom并不做任何解释.它仅是把文档中的数据转变成一颗树而已,原有的文档格式并不DOM中出现.

 

Simple API for XML (SAX) 的解析器

SAX解释器,可以说是一个把具体操作留给编程人员而把解释工作留给自己的一个编程模型.它并没有向DOM那样把整个XML文档加载到内存而是逐行解释然后通过事件通知给程序,由具体的程序使用这些通知,然后加以处理,这里就好像编写事件驱动的代码一样.因而就内存的占用率和解释效率而言SAX是有其适用性的.对于具体环境DOM和SAX都有其具体的应用面.

SAX的事件主要包括

文档的开始startDocument事件

对于元素而言的startElement和endElement

对于处理字符文本的characters 事件

以及文档的结束endDocment事件

JDOM API

DOM和SAX虽然提供了非常丰富的功能.可是对于开发人员而言这同时也带来巨大的负担.因为太过复杂,因此开源社区推出了的Jason Hunter 和 Brett McLaughlin 两位JAVA专家推出了JDOM作为一个比较简单的API.JDOM在背后会提供适配器选择具体的XML解释器.同样它也提供了树型结构来处理XML,而JDOM的树更简介.因此它兼顾了DOM和SAX的有点.当然也降低了灵活性.因此如果单纯的使用JDOM也是一个不错的选择.

三种API的对本

DOM 模型:

需要对整个文档结构有整体了解的情况

需要修改文档结构的情况

需要多次引用该文档的情况

SAX模型:

内存占有要求有限的情况

只需要读取XML部分元素的情况

只需要引用XML文档一次的情况

XML 文档对象模型(DOM)简介:

DOM由W3C推出的目的是为了提供一个良好的分析结构,用于操作XML中的标记.这个模型和类似于HTML的标记分析模型.它提供了一组操作接口,可以被各个具体平台所实现.因此可以选择任何满足DOM的解释器所提供的编程接口所实现的应用程序.将会很方便的移植到其他实现了DOM编程接口的平台工作.

对于标准DOM而言.它提供了的接口是一组可以描述XML文档树型结构的对象,以及通过这些对象可以对XML文档操作的方法.而应用程序只要调用这些对象以及对象操作.就等于在操作XML文件.这样就简化了XML文件的操作.使得编程接口足够的抽象.那么也就是说要熟悉DOM编程模型我们首要的就是熟悉DOM所提供的对象和方法.

下面我们就逐个熟悉DOM所提供的对象和方法:

Document:

该对象所描述的是整个XML文档.也就是整个树.对于树而言它可以表示为包含了很多节点的整体对象.而这些节点统称为Node.

Node:

node是一个相对抽象的概念,因此在java的定义中node被描述为接口.该接口扩展了几个子接口.

Element: 表示文档中的元素

Attribute:表示XML文件中的属性

Text:表示节点中的文字

其他的节点类型包括:Comment 表示 XML 文件中的注释、ProcessingInstruction 表示处理指令、CDATASection 表示 CDATA 节。对于这些有兴趣的读者可以参考相关文档.这里就不一一详解.

处理 DOM 经常要用到以下方法:

Document.getDocumentElement():返回 DOM 树的根。(该函数是 Document 接口的一个方法,没有定义其他的 Node 子类型。)

Node.getFirstChild() 和 Node.getLastChild():返回给定 Node 的第一个和最后一个孩子。

Node.getNextSibling() 和 Node.getPreviousSibling():返回给定 Node 的下一个和上一个兄弟。

Element.getAttribute(String attrName):对于给定的 Element,返回名为 attrName 的属性的值。如果需要 "id" 属性的值,可以使用 Element.getAttribute("id")。如果该属性不存在,该方法返回一个空字符串 ("")。

下面我们来做基本的DOM的示例,该示例很简单只是简单的显示上面的Book.xml文档中的内容.这也是DOM所做的基本事情.

代码如下:

import javax.xml.parsers.*;

import org.w3c.dom.*;

public class DomXml{

public static void main(String[] args)throws Exception{

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder bulider=factory.newDocumentBuilder();

Document doc=bulider.parse("BookXml.xml");

NodeList nl=doc.getElementsByTagName("Book");

for(int i=0;i<nl.getLength();i++){

Element node=(Element)nl.item(i);

System.out.println("BookName is :" +

node.getElementsByTagName("bookName").item(0).getFirstChild().getNodeValue().trim());

System.out.println("BookAuthor is :" +

node.getElementsByTagName("bookAuthor").item(0).getFirstChild().getNodeValue().trim());

System.out.println("BookISBN is :" +

node.getElementsByTagName("bookISBN").item(0).getFirstChild().getNodeValue().trim());

System.out.println("BookPrice is :" +

node.getElementsByTagName("bookPrice").item(0).getLastChild().getNodeValue().trim()+"/n/n");

}

}

}

代码很简单.只是把结果打印出来

 

 

在这段代码中我们可以看到的是

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();

DocumentBuilder bulider=factory.newDocumentBuilder();

Document doc=bulider.parse("BookXml.xml");

这样三段代码.DOM模型提供了一个工厂,由这个工厂负责加载XML解释器.这样使得程序员脱离了具体的编程环境.无需知道有关解释器的相关信息.而DocumentBuilder提供了创建XML文档的方法.通过这个对象,也使得程序无需和底层I/O系统打叫道.并且该对象会通过解释器生成正确的XML文档树.这样XML就被装载到了内存并生成了正确的树格式.

那么第二步就是要读取正确的文档内容了.读取正确的文档内容就如同对树的操作.首先遍历所需要的节点.然后读取数据就可以了.

因此理一下整个通过DOM读取XML文档的内容就可以得出一下步骤:

1.通过DocumentBulderFoctory创建XML解释器.

2.通过解释器创建一个可以加载并生成XML的DocumentBuilder

3.通过DocumentBuilder加载并生成一颗XML树.Document对象的实例

4.通过Document可以遍历这颗树.并读取相应节点中的内容.

关于解释器的加载,以及生成器的加载都是放在import javax.xml.parsers包中的.该包中处了DOM以外还包括SAX解释器和生成器.那么下面我们将讨论关于SAX的话题.

通过DOM模型创建XML文档

通过DOM编程接口除了可以读取XML文档中的数据,还可以创建XML文档。因为DOM提供的对象可以生成一颗描述XML文档的数结构,所以通用,可以把这颗生成在内存中的树结构写入到任意的输出流。这就需要通过XmlDocument的write方法。该方法用以写出XML文档到输出流。

事例代码:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.XmlDocument;
import java.io.*;

public class DomXml{
public static void main(String[] args)throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.newDocument();
Element books=doc.createElement("Books");

Element book=doc.createElement("Book");
book.setAttribute("id","001");
book.appendChild(doc.createTextNode("J2EE Book"));

books.appendChild(book);
doc.appendChild(books);
((XmlDocument)doc).write(new FileOutputStream(new File("dom.xml")));
((XmlDocument)doc).write(System.out);
}
}

该程序的目的是创建一个XML文档而后,创建该文档的结构,然后输出所创建的结构,这里使用了两个流,一个是针对屏幕的输出流,还有一个是针对文件的输出流。

通过DOM修改XML文档

在JAXP中提出了,把DOM所生产的XML看成一个源,可以通输出流把所修改的源重新写回到XML文档中这样。从XML文件中解释出的DOM树就可以起到同步更新的作用。这个过程首先依赖雨XML文件的解释器。解释器首先分析XML文档然后生产树结构,应用程序可以操作这颗树,然后把操作结果作为源写回到XML文件中去。这里就要用到。DOMSource对象把Document所描述的树转变成源对象,然后可以通过一个Transformer把源写回到XML文件中去。下面给出一个程序事例文件。

文档如下,所操作的XML文件还是我们所熟悉的BookXml.xml。

事例代码如下:

import javax.xml.parsers.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.*;
import org.w3c.dom.*;

public class ModifyXml{
public static void main(String[] args)throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("BookXml.xml");

Element book;
Element bookName;
Element bookAuthor;
Element bookISBN;
Element bookPrice;

//insert
book=doc.createElement("Book");
book.setAttribute("id","4");

bookName=doc.createElement("bookName");
bookName.appendChild(doc.createTextNode("J2EE Programme begin Book"));
book.appendChild(bookName);

bookAuthor=doc.createElement("bookAuthor");
bookAuthor.appendChild(doc.createTextNode("Hesj"));
book.appendChild(bookAuthor);

bookISBN=doc.createElement("bookISBN");
bookISBN.appendChild(doc.createTextNode("7-145-10241-3"));
book.appendChild(bookISBN);

bookPrice=doc.createElement("bookPrice");
bookPrice.appendChild(doc.createTextNode("77.8"));
book.appendChild(bookPrice);

Node books=doc.getElementsByTagName("Books").item(0);
books.appendChild(book);

//delete
// books.removeChild(book);

//modify
NodeList allBook=doc.getElementsByTagName("Book");
Element opBook=null;
for(int i=0;i<allBook.getLength();i++){
opBook=(Element)allBook.item(i);
String id=opBook.getAttribute("id");
if(id.equals("4")){
break;
}
}
opBook.getElementsByTagName("bookAuthor").item(0).getFirstChild().setNodeValue("Bluce");

TransformerFactory tf=TransformerFactory.newInstance();
Transformer tr=tf.newTransformer();
DOMSource ds=new DOMSource(doc);
StreamResult sr=new StreamResult(System.out);
tr.transform(ds,sr);
}
}

这里,首先创建一个Book节点。然后添加到Document中,紧接着可以删除和修改该节点。

简单XML 编程接口( SAX)

为了解决DOM解释器需要占有大量内存的问题,因此提出了一种不加载整个XML文档.生成树.而是逐段读取XML文档然后抛出事件的解释方案.因此提出了SAX编程接口的策略.这样SAX既无需生成内存中的树结构,又无需去创建任何对象去描述XML所以节约了内存开销.只是单纯的去解释XML文件而已.

进而了解SAX所发生的事件成了对使用SAX编程是必须的.对于SAX而言事件的抛出是由解释器完成的,而处理则是交给应用程序完成的,所以实现事件接口和填写事件代码就是我们的事情.对于事件可以处理也可以不处理,不过由于SAX是不创建任何对象的.所以事件的状态也是不保持的.如果想要在多个事件中维护状态,也同样是应用程序的事情.

SAX事件说明:

对于SAX而言事件就是其编程的核心.常用的事件主要有5种.

startDocument()

该事件表示解释器开始解释文档.它没有传递任何参数,因此这里无需处理XML文档数据.

endDocument()

该事件表明解释器准备结束对XML文档的解释.因此以上两个事件都没有做太多实际工作

startElement(...)

告诉您解析器发现了一个起始标签。该事件告诉您元素的名称、该元素所有属性的名称和值,还会告诉您一些名称空间的信息。

characters(...)

告诉您解析器发现了一些文本。您得到一个字符数组、该数组的偏移量和一个长度变量,有这三个变量您就可以访问解析器所发现的文本。

endElement(...)

告诉您解析器发现了一个结束标签。该事件告诉您元素的名称,以及相关的名称空间信息。

startElement()、characters() 和 endElement() 是最重要的事件,后面将集中介绍这三个事件。所有这些事件都属于 ContentHandler 接口,定义的其他 SAX 接口处理错误、实体及其他很少使用的内容。

 

startElement() 事件

startElement() 事件告诉您 SAX 解析器发现了一个元素的起始标签。该事件有四个参数:

String uri

名称空间 URI。由于我的 XML 文档没有使用名称空间,因此这里不讨论其意义,所以可以不理会它.关于名称空间可以参考其他XML相关资料.

String localName

一个不包括名称空间的元素名称

String qualifiedName

元素的限定名,即名称空间前缀和元素本地名称的组合。

org.xml.sax.Attributes attributes

一个包含该元素所有属性的集合.该对象提供了几种方法获取属性的名称和值,以及该元素的属性个数。

如果您的 XML 应用程序查找某个元素的内容,startElement() 事件可以告诉您该元素何时开始。

 

 

characters() 事件

characters() 事件包含解析器在源文件中发现的字符。本着最小化内存占用的精神,这个事件包含一个字符数组,这与 Java String 对象相比要轻型得多。以下是 characters() 事件的参数:

char[] characters

解析器所发现的字符数组。

int start

属于该事件的 characters 数组中的一个字符的索引号。

int length

该事件中字符的的个数。

如果您的 XML 应用程序需要存储特定元素的内容,可以把存储那些内容的代码放在 characters() 事件处理程序中。

endElement() 事件

endElement() 事件告诉您解析器发现了某个元素的结束标签。它有三个参数:

String uri String localName String qualifiedName

这三个参数和startElement一样.

对该事件的典型响应是改变 XML 应用程序中的状态信息。如,在我的程序中将是把读取的XML文档打印到屏幕中去.

那么下面我们将编写一个关于SAX的应用程序.同样它和刚才DOM那个程序相同用来打印所解释的XML文档信息.

代码如下:

import java.io.File;

import javax.xml.parsers.*;

import org.xml.sax.helpers.*;

import org.xml.sax.*;

public class SaxXml extends DefaultHandler{

private String ElementName;

private int id;

private String bookName;

private String bookAuthor;

private String bookISBN;

private String bookPrice;

public SaxXml(){

this.ElementName="";

this.id=0;

this.bookName="";

this.bookAuthor="";

this.bookISBN="";

this.bookPrice="";

}

public void startDocument(){

System.out.println("Document Begin");

}

public void startElement(String uri,String localName,String qName,Attributes attributes){

this.ElementName=qName;

if(qName.equals("Book"))

System.out.println(attributes.getValue(0));

}

public void characters(char[] ch,int start,int length){

String str=new String(ch,start,length);

if(this.ElementName.equals("bookName") && !str.trim().equals("")){

this.bookName=str;

}

if(this.ElementName.equals("bookAuthor") && !str.trim().equals("")){

this.bookAuthor=str;

}

if(this.ElementName.equals("bookISBN") && !str.trim().equals("")){

this.bookISBN=str;

}

if(this.ElementName.equals("bookPrice") && !str.trim().equals("")){

this.bookPrice=str;

}

}

public void endElement(String uri,String localName,String qName){

if(qName.equals("bookName")){

System.out.println(this.bookName);

}

if(qName.equals("bookAuthor")){

System.out.println(this.bookAuthor);

}

if(qName.equals("bookISBN")){

System.out.println(this.bookISBN);

}

if(qName.equals("bookPrice")){

System.out.println(this.bookPrice);

}

if(qName.equals("Book")){

System.out.println();

}

this.ElementName="";

}

public void endDocument(){

System.out.println("Document End");

System.exit(0);

}

public static void main(String[] args)throws Exception{

SAXParserFactory factory=SAXParserFactory.newInstance();

SAXParser parser=factory.newSAXParser();

parser.parse(new File("BookXml.xml"),new SaxXml());

}

}

该代码通过事件实现了读取XML文档的作用.这里稍微要注意的是空白区域的处理,我这里是通过String的trim方法解决的.当然你也可以使用其他方法.这个程序中.在startElement中用来设置ElementName(元素的名字)这个状态,而在characters通过该状态作出相应的动作.这里主要是把读取的信息放到我们的对象的属性中去.在通过endElement事件来读取该属性.

SAX的开发步骤如下:

1. 实现ContentHandler 接口并填写事件代码(这里我所用的是继承DefaultHandler类,该类实现了ContentHandler 接口)

2. 创建SAX解释器工厂

3. 通过工厂创建SAX解释器

4. 使用SAX解释器加载XML文档,在把已经实现了ContentHandler 接口的类实例对象装入解释器

5. 解释器通过回调你的事件过程

 

 

 

 

Java XML编程全解 本文还有配套的精品资源,点击获取 简介:本书为Java开发者提供了处理XML技术的全面指南,涵盖了XML基础知识、各种解析技术、数据绑定、查询与转换方法,以及XML在Web服务和配置管理中的应用。深入解析了DOM、SAX、StAX解析技术,JAXB数据绑定,XPath查询,XSLT转换,以及XML Schema验证等关键XML技术。同时,书中还介绍了如何在Java中使用SO... 阅读详情

相关推荐

Java XML编程从入门到精通

htmltable {th, td {th {pre {简介:《Java XML编程指南》是一本专为Java开发者编写的实用指南,重点讲解了XML在Java环境中的应用,包括数据处理、通信等。书中深入介绍了XML的基础知识、在Java中的解析方法(如DOM、SAX和StAX),并涵盖了使用JAXB进行对象到XML的映射、JAXP的XML处理标准接口、XML Schema和DTD的定义、以及如何创建和消费SOAP服务。

weixin_31974443的博客 924

day24XML、工厂模式、装饰模式

XML XML eXtensible Markup Language 可扩展的标记语言 它是一种数据的表示格式,可用来表示结构复杂的数据 常用于数据的存储和传输 XML的几个特点和使用场景 一是纯文本,默认使用UTF-8编码;二是可嵌套; 如果把XML内容存为文件,那么它就是一个XML文件。 XML的使用场景:XML内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统的信息。 XML的语法规则 XML的创建 创建一个xml文件 语法规则: 第一行必须是文档声明 标签(元素)规则 标签由一对尖括号和

xiao_baibai1025的博客 520

Java与XML集成编程全面指南

本文还有配套的精品资源,点击获取 简介:《Java XML编程指南》系统阐述了Java与XML的结合使用方法,涵盖了XML基础知识、JAXP、XPath、XSLT、RESTful服务、JAXB以及Spring框架中的XML配置。本书帮助读者掌握XML技术在Java应用程序中的应用,从基础到高级概念,包括数据处理、网络通信以及Web服务开发等。 1. XML基础语法和结...

weixin_35886636的博客 803

一文详细讲解JAVA开发中的XML

XML的全称是EXtensible Markup Language , 可扩展标记语言编写XML就是编写标签,与HTML非常类似,扩展.xml良好的人机可读性。

RockyBlogs 4610

CentOS7下通过YUM源高效部署Zabbix7 Agent指南

本文详细指导在已结束生命周期的CentOS7系统上,通过更换YUM源(如阿里云镜像)并添加Zabbix官方仓库,高效部署Zabbix7 Agent。文章涵盖从源配置、软件安装、关键参数修改到服务启动与防火墙设置的全流程,帮助用户解决依赖错误,快速建立服务器监控。

weixin_29230059的博客 268

glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)

我的系统是Redhat7.6, 理论上Redhat7/Centos7都可以使用该方法解决问题。 首先慎重提醒各位:glibc升级会产生无法预料的后果!由于Android NDK需要高版本的glibc才可以使用,所以作死手动去更新了glibc2.18,使得重启系统后图形界面消失。(Redhat/Centos升级此类安装包最好用yum升级,因为系统内的程序对他们的依赖很大,升级会导致大部分程序无法使用...

weixin_42881528的博客 9695

Java中XML的解析

​ 当将数据存储在XML后,我们就希望通过程序获取XML的内容。如果我们使用Java基础所学的IO知识是可以完成的,不过你学要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。以下面books.xml文档为例。

SHI940637335的博客 7099

002、搭建你的第一个Agent开发环境:Python与核心库安装

在上一篇《Agent智能体开发入门:概念、应用与前景》中,我们描绘了Agent智能体的宏伟蓝图,理解了其作为“数字员工”的巨大潜力。然而,许多开发者在迈出第一步时,常常被复杂的依赖、版本冲突和晦涩的配置所劝退,空有想法却无从下手。这种感觉就像拿到了一张藏宝图,却找不到出发的港口。本文正是你的“启航指南”。我们将彻底解决这个痛点,通过一个清晰、可复现的流程,为你搭建一个专为Agent开发量身定制的Python环境。一个纯净、隔离的Python虚拟环境,避免项目间的“依赖地狱”。一套经过验证的核心工具链。

G_RE_RE的博客 111

Java XML XML解析,设计模式等

Java XML XML解析,设计模式

wangjh11234的博客 1377

手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环

本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特

MHD0815的博客 79

MIPI CPHY学习笔记02:TX物理层一致性测试项解析(HS信令模式)第一部分

在手机、平板等移动设备中,MIPI C-PHY是连接相机、显示屏等高速外设的“数据高速公路”。高速(HS)信令模式就是这条公路的“快车道”,专门用于传输高清图像、视频等大容量数据,既要保证传输速率,又要维持信号稳定。物理层一致性测试是对这条“快车道”的全面质检,确保高速传输下数据不卡顿、不失真。今天我们聚焦MIPI C-PHY TX(发射端)的Group 2 HS信令测试,用通俗语言拆解22个核心测试项(含2个过时项),看懂高速信号的合格标准。

一只豌豆象的博客 289

第十二章_基础加强(2)_xml及约束

目录一、xml1 - xml概述2 - xml解析 一、xml 1 - xml概述 xml概述:XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言 标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展:标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 作用:用于进行存储数据和传输数据;作为软件的配置文件 作为配置文件的优势:可读性好;可维护性高 标签规则 标签由一对尖括号和合法标识符组成:<s

qq23001186的博客 266

合肥工业大学嵌入式系统原理实验报告

GPKDAT 的6、7引脚设置低电平,设置GPKDAT = 0x30则34灯亮12灯灭,GPKDAT 的4、5、6、7引脚全为高电平,设置GPKDAT = 0xf0,则led灯全灭。注意在烧写时要连接主机后面的USB接口,烧写完成后,要关闭开发板电源,将S2拨动开关置于NAND位置,然后重新开启开发板电源, 则开发板运行刚刚烧入的裸机程序。实验修改要求:在延时不变的条件下,将原程序中四个LED全亮,然后全灭的显示状态,修改为“四个全亮,然后1和2亮(3和4灭),然后3和4亮(1和2灭),最后全灭”。

Martin-share的博客 3098

浅出Java 的Xml编程(转贴)

 浅出Java 的Xml编程作者:何双江(yarshray)对于Xml,我的认识是,一个用来存放数据的标准格式.怎么看我都觉得XML和Html,完全不一样,也许仅仅只是都使用了标记来作为文档解释的原因吧.所以人们才喜欢把XML和HTML对比来看.对于我个人而言,XML就是一个简单方便的数据文件.因为.它不同与一般的关系型数据库,把数据看出二维表.通过基本的关系运算,获取二维

民兵的家园 1016

Python 爬虫教程:美食网站 + 社交平台餐馆评论抓取(评分提取 + 情感分析)

在当今数字化时代,数据无处不在,而爬虫技术则是获取数据的强大工具之一。无论是市场调研、学术研究还是个人兴趣探索,爬虫都能帮助我们从海量的网络信息中提取有价值的数据。本文将通过一个实战案例,带领大家学习如何使用 Python 爬虫技术抓取美食网站和社交平台上的餐馆评论,并进行评分提取与情感分析。通过这个项目,你将掌握爬虫的基本原理、数据解析、以及如何结合情感分析技术来挖掘数据背后的洞察。

u014481728的博客 311

C#函数返回多个值实现实例

本文实例讲解C#函数返回多个值多种实现方法。

qq_30725967的博客 1170

浅出Java 的Xml编程(转载)

  对于Xml,我的认识是,一个用来存放数据的标准格式.怎么看我都觉得XML和Html,完全不一样,也许仅仅只是都使用了标记来作为文档解释的原因吧.所以人们才喜欢把XML和HTML对比来看.对于我个人而言,XML就是一个简单方便的数据文件.因为.它不同与一般的关系型数据库,把数据看出二维表.通过基本的关系运算,获取二维表中的数据.XML仅仅把数据当成一个文档,然后正对文档解析获取数据.所以我的

谢小进的专栏 721

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

简析JAVA的XML编程

  XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平台(比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等)也都把支持XML开发作为宣传口号之一 。由于笔者所从事的电子政务开发较早的引入了XML,所以尝到了许多甜头,在许多项目中利用XML数据交换信息,省去了许多麻烦事,不用制定繁锁的数据格式,利用XML数据易于表达,也利于一线开发者跟踪调试

!Java 1940

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[转载]利用JAVA技术进行XML编程

利用JAVA技术进行XML编程关于本教程 在过去几年中,XML 已经成为一种通用的数据格式。这篇经过修订的教程将向您介绍 Java 语言中处理 XML 文档最常用的编程接口。 最普通的 XML 处理工作是 解析 XML...

congji3817的博客 249

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

[转载]Java与XML联合编程

Java与XML联合编程从XML诞生之日起,它就一直是业界的焦点话题之一。经过了几年的发展,XML技术日趋成熟,现在越来越多的应用都是基于XML开发的。在 Internet日益普及的今天,分布式编程日显重要,越来越多的应用都开...

congji3817的博客 163

JAVA编程中更新XML文档的常用方法

JAVA编程中更新XML文档的常用方法    JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个Pluggability Layer,在Pluggability Layer的支持之下,JAXP既可

为理想而奋斗 1551
上一篇: 浅出Java Socket 编程
下一篇: Java 网络文件传输
yarshray
博客等级 码龄25年 72粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值