用Castor 处理XML文档
——Castor可以完成Java和XML的相互转换
这里将介绍Castor来完成Java对象到xml的相互转换。它是怎么样转换的?和前面不同的是castor可以用一个mapping.xml文件来描述转换后的Java对象的xml基本形态,类似于xStream的annotation,这点还是非常不错的。下面我们就来看看Castor是怎么样完成Java 对象到XML之间的相互转换吧。
一、准备工作
1、官方资源
本示例会运用到如下依赖包(jar包):
2、程序测试运行代码
package com.hoo.test;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.hoo.entity.Account;
import com.hoo.entity.AccountArray;
import com.hoo.entity.Birthday;
import com.hoo.entity.ListBean;
import com.hoo.entity.MapBean;
/**
* function:Castor完成Java对象到XML的相互转换
* 依赖jar: castor-1.3.jar
* castor-1.3-core.jar
* junit-4.8.2.jar
* log4j-1.2.16.jar
* commons-logging.jar
* @author hoojo
* @createDate 2011-4-21 下午07:57:26
* @file CastorTest.java
* @package com.hoo.test
* @project WebHttpUtils
* @blog https://www.360docs.net/doc/0715549113.html,/IBM_hoojo
* @email hoojo_@https://www.360docs.net/doc/0715549113.html,
* @version 1.0
*/
public class CastorTest {
private Account bean = null;
private Mapping mapping = new Mapping();
private StringWriter writer = null;
private StringReader reader = null;
@Before
public void init() {
bean = new Account();
bean.setAddress("北京");
bean.setEmail("email");
bean.setId(1);
bean.setName("jack");
Birthday day = new Birthday();
day.setBirthday("2010-11-22");
bean.setBirthday(day);
try {
/**
* 加载mapping.xml,此文件是对需要转换的Java对象的配置描述, * 即:转换后的Java对象的xml内容的转换规则
*/
mapping.loadMapping(System.getProperty("user.dir") +
"\\src\\mapping.xml");
} catch (IOException e) {
e.printStackTrace();
} catch (MappingException e) {
e.printStackTrace();
}
}
@After
public void destory() {
bean = null;
mapping = null;
try {
if (writer != null) {
writer.flush();
writer.close();
}
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
System.gc();
}
public void fail(Object o) {
System.out.println(o);
}
public void failRed(Object o) {
System.err.println(o);
}
}
Mapping对象可以完成Java对象到XML的编组和解组,它需要先设定一个mapping.xml,通过xml对JavaObject的描述。来完成JavaObject的编组、解组工作。
3、看看即将被转换的JavaEntity代码
Account
package com.hoo.entity;
public class Account {
private int id;
private String name;
private String email;
private String address;
private Birthday birthday;
//setter、getter
@Override
public String toString() {
return this.id + "#" + https://www.360docs.net/doc/0715549113.html, + "#" + this.email + "#" + this.address + "#" + this.birthday;
}
}
Birthday
package com.hoo.entity;
public class Birthday {
private String birthday;
public Birthday(String birthday) {
super();
this.birthday = birthday;
}
//getter、setter
public Birthday() {}
@Override
public String toString() {
return this.birthday;
}
}
AccountArray
package com.hoo.entity;
public class AccountArray {
private Account[] accounts;
private int size;
public int getSize() {
size = accounts.length;
return size;
}
public void setSize(int size) {
this.size = size;
}
public Account[] getAccounts() {
return accounts;
}
public void setAccounts(Account[] accounts) {
this.accounts = accounts;
}
}
ListBean
package com.hoo.entity;
import java.util.List;
public class ListBean {
private String name;
private List list;
//setter、getter
}
MapBean
package com.hoo.entity;
import java.util.Map;
public class MapBean {
private Map
public Map
return map;
}
public void setMap(Map
}
}
二、编组JavaObject到XML
1、将JavaBean编组,转换成XML
/**
* function:将Javabean编组,转换成XML
* @author hoojo
* @createDate 2011-4-22 下午12:08:48
*/
@Test
public void writeBean2XML() {
writer = new StringWriter();
try {
//编组
Marshaller.marshal(bean, writer);
fail(writer);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
代码很简单,通过Marshaller的marshal方法来完成Java对象到XML的编组(序列化、转换)工作。
运行后的结果如下:
2、将List集合转换成XML
/**
* function:将List转换成xml
* @author hoojo
* @createDate 2011-4-22 下午12:11:00
*/
@Test
public void writeList2XML() {
writer = new StringWriter();
List
list.add(bean);
bean = new Account();
bean.setName("tom");
bean.setId(223);
list.add(bean);
try {
Marshaller.marshal(list, writer);
fail(writer);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
运行后,结果如下:
xmlns:java="https://www.360docs.net/doc/0715549113.html," id="1" xsi:type="java:com.hoo.entity.Account">
xmlns:java="https://www.360docs.net/doc/0715549113.html," id="223" xsi:type="java:com.hoo.entity.Account">
怎么样,List存放的是2个Account吧。
3、将Array数组转换成XML
/**
* function:将Array数组转换成XML
* @author hoojo
* @createDate 2011-4-22 下午12:11:25
*/
@Test
public void writeArray2XML() {
writer = new StringWriter();
Account[] acc = new Account[2];
acc[0] = bean;
bean = new Account();
bean.setName("tom");
bean.setId(223);
acc[1] = bean;
try {
Marshaller.marshal(acc, writer);
fail(writer);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
结果如下:
4、转换其他Java类型
/**
* function:将Java常用类型编组成xml
* @author hoojo
* @createDate 2011-4-22 下午12:11:44
*/
@Test
public void writeObject2XML() {
writer = new StringWriter();
try {
Marshaller.marshal(true, writer);
Marshaller.marshal(9527, writer);
Marshaller.marshal(2.2f, writer);
Marshaller.marshal(1.11d, writer);
Marshaller.marshal("lucy", writer);
Marshaller.marshal("hello castor".getBytes(), writer);
Marshaller.marshal(new char[] { 'a', 'b', 'c' }, writer);
Marshaller.marshal(new String[] { "hi", "spring", "castor" }, writer);
fail(writer);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
结果如下:
<[-b>aGVsbG8gY2FzdG9y[-b>
都是类型为节点名称,值为text。但是这里并没有出现Map,如果转换Map需要mapping 进行配置。下面再慢慢道来-.-
5、将xml解组成JavaBean
/**
* function:将XML内容,解组成JavaBean
* @author hoojo
* @createDate 2011-4-22 下午12:12:14
*/
@Test
public void readXML2Bean() {
String xml = "" +
"
"
"
reader = new StringReader(xml);
try {
//解组
Account account = (Account) Unmarshaller.unmarshal(Account.class, reader); fail(account);
} catch (MarshalException e) {
e.printStackTrace();
} catch (ValidationException e) {
e.printStackTrace();
}
}
结果如下:
1#jack#email#北京#2010-11-22
其他的类型,如:map、list、array都不能成功解组。因为这些类型里面有很多系统默认的xml描述。但是利用mapping和自定义JavaBean就可以成功编组和解组了。下面看看mapping是怎么玩转这些类型的。
三、利用mapping配置,编组JavaObject、解组XML
最开始的init方法就提供了mapping,让我们对mapping这个配置有了大概的了解。下面我们将详细介绍mapping是个什么:
1、在此之前我们设置过mapping.xml。如果不设置,肯定是不能转换成我们想要的XML的。那么,mapping.xml配置文件是怎么配置Account这个对象的呢?
mapping.xml配置如下:
"https://www.360docs.net/doc/0715549113.html,/mapping.dtd">
首先,看看这个xml文档的根元素是mapping,在mapping中可以配置class。也就是我们要转换的JavaObject的配置描述了。
class元素的name属性就是配置的JavaObject的classpath路径了。
关于class元素的auto-complate属性,如果这个属性的值为ture。那么编组后的xml,castor会自动给没有在mapping配置文件进行配置的属性自动编组(转换)到xml中。如果为false,那么在mapping配置文件中出现的属性将在编组后不现在在编组后的xml中。
map-to就是当前class编组后的xml文档的节点元素名称。
field就是描述JavaObject中的属性,name是Java对象的属性名称,type是类型。关于配置的type类型也有规定,你可以参考:https://www.360docs.net/doc/0715549113.html,/xml-mapping.html的
field配置讲解。
而field还有其他的属性配置,如get-method应该是getter方法、set-method应该是setter 的方法、has-mehtod应该是hashCode方法,有时候我们不一定要提高getter、setter方法,我们需要用自己的方法名称来代替setter、getter。如果当前field配置的是集合类型,那么你需要给field元素配置collection属性。
bind-xml就是绑定(编组)成xml后的xml内容的描述,name就是编组后xml的节点元素名称,node有2个值,分别是attribute、element。attribute是属性,它会在节点元素的属性中显示,例如:
而element则是单独的一个元素,例如:
就这个样子的。
mapping.xml还可以有其他标签,如:
导入外部xml文件,可以分多个配置。
好了,先将这么多的mapping方面的内容。我们还是看看实际运行的示例吧,代码如下:
/**
* function:将XML内容解组成Java对象
* @author hoojo
* @createDate 2011-4-22 下午12:13:28
*/
@Test
public void bean4Mapping2XML() {
writer = new StringWriter();
try {
//编组
Marshaller mar = new Marshaller(writer);
mar.setMapping(mapping);
mar.marshal(bean);
fail(writer);
//解组
reader = new StringReader(writer.toString());
Unmarshaller unmar = new Unmarshaller(Account.class);
unmar.setMapping(mapping);
Account account = (Account) unmar.unmarshal(reader);
fail(account);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
运行后结果如下:
1#jack#email#北京#2010-11-22
上面的xml的根节点是Account,这个功劳就来源于mapping配置中的map-to元素,而根节点的id属性是有field和bind-xml来完成的。当bind-xml的node值为attribute时,就会以属性的方式显示。当node为element时,就会像后面name、email一样,以元素名称显示。
再看看上面的mapping文件中的Account的配置,有个auto-complate属性,如果把这个属性的值设置成false,会怎么样?那我们赶紧试试。
没有发现上面异样,但是当我们删除下面配置的filed的时候,就发现有变化了。
结果如下:
birthday="2010-11-22"/>
0#jack#email#北京#2010-11-22
发现id没有显示在xml中,那么我们再将auto-complate的属性设置true,会有什么惊喜?
结果如下:
1#jack#email#北京#2010-11-22
发现id又回来了,但是Account的配置中并没有配置id的field。这是为什么,其实auto-comlate在上面已经讲过了。Castor在编组时会自动将int类型的属性,显示在父元素的属性中。并且JavaObject中有的属性没有在mapping配置文件中配置,castor也会自动将其编组在xml中。
下面我们看看map-to配置的用法,map-to的主要属性是name,也就是我们把当前根元素重命名的名称。Map-to还有2个属性可以用,分别是ns-uri、ns-prefix。看名称就知道它大概的意识,一个是命名空间的uri另一个则是命名空间的前缀。我们给上面mapping加上这两个属性看看。
结果如下:
id="1"> birthday="2010-11-22"/>
1#jack#email#北京#2010-11-22
发现了什么?节点元素都带上了ns-prefix的值,而根元素则有了xml的ns。
2、将一段XML格式字符串转换成JavaBean
@Test
public void readBean4Mapping2XML() {
String xml = "" +
" id=\"2241\">
try {
reader = new StringReader(xml);
Unmarshaller unmar = new Unmarshaller(Account.class);
unmar.setMapping(mapping);
Account account = (Account) unmar.unmarshal(reader);
fail(account);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
运行后结果如下:
2241#jack#email#北京#2010-11-22
3、将XML内容解组成Java的Array
/**
* function:将XML内容解组成Java的Array
* @author hoojo
* @createDate 2011-4-22 下午12:14:50
*/
@Test
public void array4Mapping2XML() {
writer = new StringWriter();
Account[] acc = new Account[2];
acc[0] = bean;
bean = new Account();
bean.setName("tom");
bean.setId(223);
acc[1] = bean;
AccountArray array = new AccountArray();
array.setAccounts(acc);
try {
Marshaller mar = new Marshaller(writer);
mar.setMapping(mapping);
mar.marshal(array);
fail(writer);
reader = new StringReader(writer.toString());
Unmarshaller unmar = new Unmarshaller(AccountArray.class);
unmar.setMapping(mapping);
array = (AccountArray) unmar.unmarshal(reader);
fail(array.getSize());
fail(array.getAccounts()[0]);
fail(array.getAccounts()[1]);
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
AccountArray的mapping配置如下:
collection表示是数组,auto-maming有2中值,一种是类driverByClass,另一种则是driverByField是属性。
运行后,结果如下:
id="1">
<生日 birthday="2010-11-22"/> id="223">
2
1#jack#email#北京#2010-11-22
223#tom#null#null#null
4、将Map编组、解组成JavaObject
/**
* function:xml转换成Java的Map
* @author hoojo
* @createDate 2011-4-22 下午12:15:18
*/
@Test
public void map4Mapping2XML() {
writer = new StringWriter();
MapBean mapBean = new MapBean();
Map
bean = new Account();
bean.setName("tom");
bean.setId(223);
map.put("No2", bean);
mapBean.setMap(map);
try {
Marshaller mar = new Marshaller(writer);
mar.setMapping(mapping);
mar.marshal(mapBean);
fail(writer);
reader = new StringReader(writer.toString());
Unmarshaller unmar = new Unmarshaller(MapBean.class); unmar.setMapping(mapping);
mapBean = (MapBean) unmar.unmarshal(reader);
fail(mapBean.getMap());
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Mapping配置
上面的map配置必须这样配置,利用org.exolab.castor.mapping.MapItem这个class,完成key、value的配置。
结果如下:
<生日 birthday="2010-11-22"/>
{No2=223#tom#null#null#null, No1=1#jack#email#北京#2010-11-22}
5、 JavaList编组、解组XML
/**
* function:List到XML的相互转换
* @author hoojo
* @createDate 2011-4-22 下午12:16:04
*/
@SuppressWarnings("unchecked")
@Test
public void listForMapping2XML() {
writer = new StringWriter();
List
list.add(bean);
bean = new Account();
bean.setName("tom");
bean.setId(223);
list.add(bean);
ListBean listBean = new ListBean();
listBean.setList(list);
try {
Marshaller mar = new Marshaller(writer);
mar.setMapping(mapping);
mar.marshal(listBean);
fail(writer);
reader = new StringReader(writer.toString());
Unmarshaller unmar = new Unmarshaller(ListBean.class);
unmar.setMapping(mapping);
listBean = (ListBean) unmar.unmarshal(reader);
fail(listBean.getList().size());
for (Account acc : (List
fail(acc);
}
} catch (MarshalException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
Mapping配置
结果:
<生日 birthday="2010-11-22"/> id="223">
2
1#jack#email#北京#2010-11-22
223#tom#null#null#null
如何用vc创建和读取xml文件
如何用vc创建和读取xml文件 当前Web上流行的剧本语言是以HTML为主的语言结构,HTML是一种标记语言,而不是一种编程语言,主要的标记是针对显示,而不是针对文档内容本身结构的描述的。也就是说,机器本身是不能够解析它的内容的,所以就出现了XML语言。XML (eXtensible Markup Language)语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大缩减了SGML的复杂性。XML语言系统建立的目的就是使它不仅能够表示文档的内容,而且可以表示文档的结构,这样在同时能够被人类理解的同时,也能够被机器所理解。XML要求遵循一定的严格的标准。XML分析程序比HTML浏览器更加要挑剔语法和结构,XML要求正在创建的网页正确的使用语法和结构,而不是象HTML一样,通过浏览器推测文档中应该是什么东西来实现HTML的显示,XML使得分析程序不论在性能还是稳定性方面都更容易实现。XML文档每次的分析结果都是一致的,不象HTML,不同的浏览器可能对同一个HTML作出不同的分析和显示。 同时因为分析程序不需要花时间重建不完整的文档,所以它们能比同类HTML能更有效地执行其任务。它们能全力以赴地根据已经包含在文档中的那个树结构建造出相应的树来,而不用在信息流中的混合结构的基础上进行显示。XML标准是对数据的处理应用,而不是只针对Web网页的。任何类型的应用都可以在分析程序的上面进行建造,浏览器只是XML的一个小的组成部分。当然,浏览仍旧极其重要,因为它为XML工作人员提供用于阅读信息的友好工具。但对更大的项目来说它就不过是一个显示窗口。因为XML具有严格的语法结构,所以我们甚至可以用XML来定义一个应用层的通讯协议,比如互联网开放贸易协议(Internet Open Trading Protocol)就是用XML来定义的。从某种意义上说,以前我们用BNF范式定义的一些协议和格式从原则上说都可以用XML来定义。实际上,如果我们有足够的耐心,我们完全可以用XML来定义一个C++语言的规范。 当然,XML允许大量HTML样式的形式自由的开发,但是它对规则的要求更加严格。XML主要有三个要素:DTD(Document Type Declaration——文档类型声明)或XML Schema(XML大纲)、XSL(eXtensible Stylesheet Language——可扩展样式语言)和XLink(eXtensible Link Language——可扩展链接语言)。DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素和元素的属性之间的关系;Namespace(名域)实现统一的XML文档数据表示以及数据的相互集成;XSL是用于规定XML文档呈现样式的语言,它使得数据与其表现形式相互独立,比如XSL能使Web浏览器改变文档的表示法,例如数据的显示顺序的变化,不需要再与服务器进行通讯。通过改变样式表,同一个文档可以显示得更大,或者经过折叠只显示外面得一层,或者可以变为打印得格式。而XLink将进一步扩展目前Web上已有的简单链接。 二、实现XML解析的说明 当然,从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但是实际上微软已经给我们提供了一个XML语法解析器,如果你安装了IE5.0以上版本的话,实际上你就已经安装了XML语法解析器。可以从微软站点(https://www.360docs.net/doc/0715549113.html,)下载最新的MSXML的SDK和Parser文件。它是一个叫做MSXML.DLL的动态链接库,最新版本为msxml3,实际上它是一个COM对象库,里面封装了所有进行XML解析所需要的所有必要的对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象。所以你可以用任何语言(比如VB,VC,DELPHI,C++ Builder甚至是剧本语言等等)对它进行调用,
PBDOM操作XML文档轻松入门_PowerBuilder
PBDOM操作XML文档轻松入门 2008-03-06 15:13 本文对PBDOM技术进行相关介绍,但并不涉及XML的基础知识,建议阅读者对下述相关术语有一定了解: Document(文档), DTD(文档类型定义), schema (大纲),Element(元素), attribute(属性), processing instruction (处理命令), entity(实体)。 本文主要包括以下内容: 1、为什么要使用PBDOM以及怎样创建PBDOM 2、PBDOM主要用于那些地方 3、如何使用PBDOM编程 4、PBDOM和其他XML解析(parser)技术的比较 一、什么是DOM ◆文档对象模型(Document Object Model) 1、作为一项W3C规范,XML DOM存在目的是为不同类型的应用程序提供一个标准的编程接口,它被设计可以跨平台、跨语言使用。 2、我们可以利用XML DOM创建XML文档并操纵其结构,增加、修改、删除元素。 3、程序中调用XML解析器载入XML文档到内存中。当文档被载入后,可以通过进入DOM检索和操作相关信息。 4、DOM 保存了XML文档树,文档(document)元素位于整棵树的最顶层。该元素可以有一到多个子节点来保存树的结构。 可以参阅以下网站: https://www.360docs.net/doc/0715549113.html,/dom/ 来了解更多的关于XML Document Object Model的内容。 二、什么时候应该使用DOM工具 ◆当你需要做下列事情的时候,你应该想到XML DOM的 1、在一个或者多个XML文档之间移动元素 2、创建新的元素并且在XML文档的任意位置插入 3、操作元素并重新插入其到XML文档其他位置 4、导入内嵌数据结构 & . pb9中,数据窗口现在可以通过XML导出内嵌数据结构(nested data structures). 三、什么是PBDOM ◆PowerBuilder 文档结构模型(PowerBuilder Document Object Model)
XML文件基本操作
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。 任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得 含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档 类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是"模式有效的(schema valid)"。 XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作, 如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助, 如有不合适的地方欢迎大家批评指正)。 本文的主要模块为: ①:生成xml文件 ②:遍历xml文件的节点信息 ③:修改xml文件的节点信息 ④:向xml文件添加节点信息 ⑤:删除指定xml文件的节点信息假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示:
XMLDocument对xml文件的增删改查操作
从结构上讲.XmlElement是XmlNode 派生类. 所以两者比较没什么意义. XmlNode 为抽像类, 不能直接实例化. 已知有一个xml文件(bookstore.xml)如下:
C#程序:如何创建xml文件以及xml文件的增、删、改、查
C#程序:如何创建xml文件以及xml文件的增、删、改、查 其实今天的这篇博文,是对请几天发表的博文的一个总结,只是想把xml文件的增删改查结合起来,这样更容易让初学的朋友理解,废话也不多说了,开始吧! 下面是我把我在vs环境下写的代码ctrl+V然后ctrl+V了的,课根据自己的需要执行相应的方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.IO; namespace WriteXml { class Program { static void Main(string[] args) { //createXml();//创建文件和添加基本数据,便于之后操作实验 //addItem();//追加数据 readtext();//读取数据 //updatexml();//更新数据 //delnode();//删除数据 } private static void createXml() { XmlTextWriter writer = new XmlTextWriter("titles.xml", null); //使用自动缩进便于阅读 writer.Formatting = Formatting.Indented; //写入根元素 writer.WriteStartElement("items"); writer.WriteStartElement("item"); //写入属性及属性的名字 writer.WriteAttributeString("类别", "文学"); writer.WriteAttributeString("品质", "优"); //加入子元素 writer.WriteElementString("title", "毛著"); writer.WriteElementString("author", "毛泽东"); writer.WriteElementString("price", "10.0"); //关闭根元素,并书写结束标签 writer.WriteEndElement(); writer.WriteEndElement(); //将XML写入文件并且关闭XmlTextWriter writer.Close();
VB NET与XML之间的操作
Imports System.Xml'声明XML Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim dataset As New DataSet'声明一个dataset dataset.ReadXml("f:¥aaa.xml")'读xml文件,并把xml文件放入到datset的第一个表中 Dim table As DataTable=dataset.Tables(0)'读出该表 Dim view As DataView=New DataView(table)'自定义视图 DataGridView1.DataSource=view'绑定数据源 End Sub Public Sub appear()'同上 Dim dataset As New DataSet dataset.ReadXml("f:¥aaa.xml") Dim table As DataTable=dataset.Tables(0) Dim view As DataView=New DataView(table) DataGridView2.DataSource=view End Sub Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button2.Click Dim xmlDou As XmlDocument=New XmlDocument()'声明一个xml文档对象 xmlDou.Load("f:¥aaa.xml")'将特定的xml文档写入xmldoucument Dim xmlnode As XmlNode=xmlDou.SelectSingleNode("bookstore")'声明一个根标记,bookstore为根标记 Dim xml1As XmlElement=xmlDou.CreateElement("book")'声明一个xml 的节点 xml1.SetAttribute("genre","李簪红")'节点的属性 xml1.SetAttribute("ISBN","2-3621-4")'同上 Dim xml1_title As XmlElement=xmlDou.CreateElement("title")'声明一个xml的节点 xml1_title.InnerText="C#程序设计入门与技巧"'定义节点的文档 xml1.AppendChild(xml1_title)'向总节点尾部添加节点 Dim xml1_author As XmlElement=xmlDou.CreateElement("author")'同上xml1_author.InnerText="张永斌"
xml练习题
XML练习题 一、填空题 1.定义电子文档结构和描述其内容的国际标准语言是,它是所有电子文档标记语言的起源。 2.能够描述其他语言及其语法和词汇表的语言称为。 3.XML文档的声明中的编码方式常用的有和GB2312。 4.HTML是用所定义的,即是SGML的一个应用。 5.XML元素由、结束标记和两者之间的内容三个部分组成。 7.XML属性的声明位置是。 8.XML文档中用来包含文本的组件是。 9.是解决XML元素多义性和名字冲突问题的方案。 10.XML是的一个子集。 11. 当XML文档符合时,称该文档是“良好格式的”(Well-formed)。 12.每个XML文档都分为两个部分:和。 13.<?xml version=”1.0”encoding=”GB2312” ?>就是一个。 14.XML 文档内容的主体部分,一般由、、、注释和内容组成。 15.XML文档中一共有四类元素,分别为,仅含有文本的,含子元素、文本或混合元素的元素。 16. XML Schema两种重要的模型是Microsoft XML Schema和。 17. Microsoft XML Schema 和W3C XML Schema 分别使用AttributeType 和声明XML文档属性。 18. 命名空间的声明一般放置在,其使用语法如下所示: xmlns:prefix=“URI” 19. XML模式负责定义和描述XML文档的结构和内容。定义XML文档中存在哪些元素和元素之间的关系,还可以定义元素和属性的数据类型。 20.所有Schema文档都必须要使用作为其根元素。 21.声明用户自定义的简单数据类型使用关键字。 22.声明复杂数据类型使用关键字。 23.Schema文档中,用于声明元素的element元素的属性minOccurs的作用是。 24. XSLT是一种将XML文档转换成其他形式文档的技术。现在常用的两种技术分别是: 和。 25. XSLT处理过程涉及4个要素:XSLT处理器、输入XML文档、输入XSLT文档和输出文档。 26. 每一个XSLT样式表中都有一个应用到根节点的模板。 27. 一个格式良好XSL文件是由标记和HTML标记组成。 28.模板是的集合,都使用定义XML数据显示的样式。 29.使用标记可以对多个同名的节点访问,并且该节点可以设置在显示数据的时候,可以按升序或降序显示。 30.可以在XSL文件中使用
使用XMLDocument操作xml文件
在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlElement xmlelem ; 第一步: //创建到服务器同名目录下的xml文件: XmlDocument xdoc = new XmlDocument(); //加入XML的声明部分 XmlDeclaration xdecl = xdoc.CreateXmlDeclaration("1.0", "gb2312", null); xdoc.AppendChild(xdecl); //加入一根元素
C#操作xml:增,删,改,查
c#操作xml https://www.360docs.net/doc/0715549113.html,/e/404232246.htm 同样是增,删,改,查四种操作。现在我们就详细介绍一下增和删两种操作。看下面的一个xml示例:
c++操作xml
c++操作xml C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,选用LIBXML2 Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH 查询,以及部分的支持XSLT转换等功能。 Libxml2的下载地址是https://www.360docs.net/doc/0715549113.html,/ windows版本的的下载地址是https://www.360docs.net/doc/0715549113.html,/libxml.en.html libxml2库依赖iconv和zlib库,所以需要下载三个 成功版本libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。 解压,在系统变量path中加上iconv-1.9.2.win32\bin;zlib-1.2.3.win32\bin;libxml2-2.6.30.win32\bin这三个地址。或者把其中的三个dll到拷贝到system32目录中 编译链接基于libxml2的程序,在VC环境中设置lib和include路径,并在link设置中添加libxml2.lib和iconv.lib. vc:项目->属性->c/c++->常规->附加包含目录,将三个文件夹的include下的.h头文件包含进工程 项目->属性->链接器->常规->附加库目录,将三个文件夹的bin下的.lib库文件包含进工程 注意,这只是将目录包含进工程,需要使用时需在代码中写 #include
xml文件介绍及使用
我们经常看到 xml 文件,只是很少去使用,顼名思义,xml 就是可扩展的标记语言,它的 发展如下图所示:
xml 和 html 的比较:
比较内容 可扩展性 签
HTML 不允许用户定义自己的扩展标 签
XML 允许用户定义自己的扩展标
结构描述
不支持深层次的嵌套表达
支持深层次的嵌套表达,适 合表示结构复杂的文档数据 结构清晰,便于阅读、维护 内容描述和表现形式相分离
可读性及可维护性 数据和显示的关系
难以阅读、维护 内容描述和表现形式合为一体
xml 比 html 强大,但是使用更加规范和严格: (1).XML 是区分大小写的; (2).所有元素的起始和结束标注必须成对出现,且要正确嵌套; (3).如果使 XML 说明,则它必须是 XML 文档的第一行:
(4).元素属性必须用引号引起来,单、双引号都可以,但必须成对出现。如:
&: 表示&字符 &apos: 表示’字符 ": 表示”字符 我们也可用 ENTITY 自定义实体:
XML操作 文档
<书库> <书> <书名>Java编程入门书名> <作者>张三作者> <出版社>电子出版社出版社> <价格>35.0价格> <出版日期>2002-10-07出版日期> 书> <书> <书名>XML在Java中的应用书名> <作者>李四作者> <出版社>希望出版社出版社> <价格>92.0价格> <出版日期>2002-10-07出版日期> 书> 书库> 下面是操作XML文件的Bean: package xml; /** * XML的读写操作Bean */ import java.io.*; import java.util.*; import org.jdom.*; import org.jdom.output.*; import org.jdom.input.*; import javax.servlet.*; import javax.servlet.http.*; public class XmlBean{ private String bookname,author,pub,price,pubdate; public String getbookname() { return bookname;} public String getauthor() { return author;} public String getpub() { return pub;} public String getprice() { return price;} public String getpubdate() { return pubdate;} public void setbookname(String bookname) { this.bookname =bookname ; } public void setauthor(String author) { this.author =author; } public void setpub(String pub) { this.pub =pub ; } public void setprice(String price) { this.price =price ; } public void setpubdate(String pubdate) { this.pubdate =pubdate ; } public XmlBean(){} /**
https://www.360docs.net/doc/0715549113.html,操作XML
一、简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点 XmlNode root=xml.SelectSingleNode("/root"); //获取节点下所有直接子节点 XmlNodeList childlist=root.ChildNodes; //判断该节点下是否有子节点 root.HasChildNodes; //获取同名同级节点集合 XmlNodeList nodelist=xml.SelectNodes("/Root/News"); //生成一个新节点 XmlElement node=xml.CreateElement("News"); //将节点加到指定节点下,作为其子节点 root.AppendChild(node); //将节点加到指定节点下某个子节点前 root.InsertBefore(node,root.ChildeNodes[i]); //为指定节点的新建属性并赋值 node.SetAttribute("id","11111"); //为指定节点添加子节点 root.AppendChild(node); //获取指定节点的指定属性值 string id=node.Attributes["id"].Value; //获取指定节点中的文本 string content=node.InnerText; //保存XML文件 string path=Server.MapPath("~/file/bookstore.xml"); xml.Save(path); //or
XML文件读取的资料
XML文档对象模型也就是(DOM) 就像层次结构的树,主要用于在内存中表示XML文档 1)DOM树定义了XML文档的逻辑结构,给出了一种应用程序访问和处理XML文档的方法。 2)在DOM树中,有一个根节点,所有其他的节点都是根节点的后代。 3) 在应用过程中,基于DOM的XML分析器将一个XML文档转换成一棵DOM树,应用程序通过对DOM树的操作,来实现对XML文档数据的操作。 三、XML文档对象(XML DOM)模型分析 XML DOM对象提供了一个标准的方法来操作存储在XML文档中的信息,DOM应用编程接口(API)用来作为应用程序和XML文档之间的桥梁。 DOM可以认为是一个标准的结构体系用来连接文档和应用程序(也可以是剧本语言)。MSXML解析器允许你装载和创建一个文档,收集文档的错误信息,得到和操作文档中的所有的信息和结构,并把文档保存在一个XML 文件中。DOM提供给用户一个接口来装载、到达和操作并序列化XML文档。DOM提供了对存储在内存中的XML文档的一个完全的表示,提供了可以随机访问整个文档的方法。DOM允许应用程序根据MSXML解析器提供的逻辑结构来操作XML文档中的信息。利用MSXML所提供的接口来操作XML。 实际上MSXML解析器根据XML文档生成一个DOM树结构,它能够读XML 文档并根据XML文档内容创建一个节点的逻辑结构,文档本身被认为是一个包含了所有其他节点的节点。 DOM使用户能够把文档看成是一个有结构的信息树,而不是简单的文本流。这样即使不知道XML的语义细节,应用程序或者是脚本也能够方便地操作该结构。DOM包含两个关键的抽象:一个树状的层次、另一个是用来表示文档内容和结构的节点集合。树状层次包括了所有这些节点,节点本身也可以包含其他的节点。这样的好处是对于开发人员来说,他可以通过这个层次结构来找到并修改相应的某一个节点的信息。DOM把节点看成是一个通常的对象,这样就有可能创建一个剧本来装载一个文档,然后遍历所有的节点,显示感兴趣的节点的信息。注意节点可以有很多中具体的类型,比如元素、属性和文本都可以认为是一个节点。 微软的MSXML解析器读一个XML文档,然后把它的内容解析到一个抽象的信息容器中称为节点(NODES)。这些节点代表文档的结构和内容,并允许应用程序来读和操作文档中的信息而不需要显示知道的XML的语义。在一个文档被解析以后,它的节点能够在任何时候被浏览而不需要保持一定的顺序。 对开发人员来说,最重要的编程对象是DOMDocument。DOMDocument对象通过暴露属性和方法来允许浏览、查询和修改XML文档的内容和结构,每一个接下来的对象暴露自己的属性和方法,这样就能够收集关于对象实
C#对XML进行增删改查操作(可封装)(精)
xml文件格式 view plaincopy to clipboardprint? 熊猫 123456 panda@https://www.360docs.net/doc/0715549113.html, asfdsafasdfasdfsad 我是内容 2009-10-1 熊猫 123456 panda@https://www.360docs.net/doc/0715549113.html, asfdsafasdfasdfsad 我是内容 2009-10-1 增加>>>> view plaincopy to clipboardprint? XmlDocument xmld = new XmlDocument(; xmld.Load(Server.MapPath("App_Code/Message.xml";//加载xml文件XmlNode root = xmld.SelectSingleNode("messageList";//查找messageList节点
int i = xmld.SelectSingleNode("messageList".ChildNodes.Count + 1; XmlElement xml0 = xmld.CreateElement("message"; xml0.SetAttribute("id", i.ToString(; XmlElement xml1 = xmld.CreateElement("Name";//创建一个Name节点xml1.InnerText = this.txtName.Value.Trim(; xml0.AppendChild(xml1;//添加 XmlElement xml2 = xmld.CreateElement("QQ";//创建QQ节点 xml2.InnerText = this.txtQQ.Value.Trim(; xml0.AppendChild(xml2;//添加 XmlElement xml3 = xmld.CreateElement("Email";//创建一个Email节点xml3.InnerText = this.txtEmail.Value.Trim(; xml0.AppendChild(xml3;//添加 XmlElement xml4 = xmld.CreateElement("Content";//创建一个Content节点xml4.InnerText = this.txtContent.Value; xml0.AppendChild(xml4;//添加 XmlElement xml5 = xmld.CreateElement("Time";//创建一个Time节点 xml5.InnerText = DateTime.Now.ToString("yyyy-MM-dd"; xml0.AppendChild(xml5;//添加 root.AppendChild(xml0; xmld.Save(Server.MapPath("App_Code/Message.xml";
VB6.0操作XML文件
VB6.0操作XML文件 XML文件如下:
Set xn = XMLDoc.selectSingleNode("testlist") '以下为读取xml文件内容,这里用ListView控件显示 Set xlst = xn.childNodes ListView1.ListItems.Clear For Each xnf In xlst Set xe = xnf Set xlst1 = xe.childNodes With ListView1.ListItems.Add(, , xlst1.Item(0).Text) .SubItems(1) = xlst1.Item(1).Text .SubItems(2) = xlst1.Item(2).Text End With Next '以下是插入一个节点(这里插入一个id=3,name=飞翔,time=date 的节点) Dim XMLId As IXMLDOMElement Dim XMLName As IXMLDOMElement Dim XMLTime As IXMLDOMElement Dim returnValue As IXMLDOMNode Set xe = XMLDoc.createElement("test") '创建一个
XML读写操作
XML读写操作小结 我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。 项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍: 1. 创建节点,将其写入XML文件,主要操作包括: 1).创建根节点:QDomElement root = doc.documentElement("rootName " ); 2).创建元素节点:QDomElement element = doc.createElement("nodeName"); 3).添加元素节点到根节点:root. appendChild(element); 4).创建元素文本:QDomText nodeText=doc.createTextNode("text"); 5).添加元素文本到元素节点:element. appendChild(nodeText); 在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下: QDomDocument doc; instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild(instruction); QDomElement root = doc.createElement("Notes"); doc.appendChild(root); QDomElement note = doc.createElement("note"); root.appendChild(note); QDomElement no = doc.createElement("no"); note.appendChild(no); ... ... QDomText no_text = doc.createTextNode("001"); ... ... 则得到一个便签节点,将其保存到test.xml文件中,代码如下: QFile file("test.xml"); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text)) return ; QTextStream out(&file); out.setCodec("UTF-8"); doc.save(out,4,QDomNode::EncodingFromTextStream); file.close(); 则test.xml文件: