对xml文档进行增删改查操作后将其修改结果保存


对xml文档进行增删改查操作后将其修改结果保存

一、可扩展标记语言xml:Extensible Markup Language
   1、XML的作用:1)统一数据传输的格式。2)做小型数据库[文件型数据库]。3)做配置文件  .ini   .propertity  .xml  .cfg
   2、XML文件的基本格式:
     标签:分为双标签和单标签,双标签的开头和结尾标签名必须一致,大小写一样,/ 开头的是结尾标签,单标签必须在 > 前加上 / 来结尾,单标签中不能放文本。
     属性:在开始标签中定义一些名值对,值一定是字符串
   3、XML文件的基本构成:
     1)在第一行是XML声明    <?xml version="1.0" encoding="UTF-8"  ?>
     2)必须且只能有一对根标签
     3)标签可以一层一层嵌

二、写一个简单的xml文档stus.xml然后用Dom进行解析。
    DOM : Document Object Model 文档对象模型
    DOM解析的基本思路:将整个XML文件一次性读入内存,将整个XML看做一棵文档树,XML中的每一个标签,属性,文本都看做是树上的一个结点,然后可以对结点进行增删改查的操作。
   已经编辑好的stus.xml文档
Java代码 复制代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <stus Class="1401" >  
  3.     <stu num="01">  
  4.         <name>张三</name>  
  5.         <age>19</age>  
  6.         <sex>男</sex>  
  7.     </stu>  
  8.     <stu  num="02">  
  9.         <name>李四</name>  
  10.         <age>20</age>  
  11.         <sex>女</sex>  
  12.     </stu>  
  13.     <stu  num="03">  
  14.         <name>王五</name>  
  15.         <age>21</age>  
  16.         <sex>男</sex>  
  17.     </stu>  
  18. </stus>  
<?xml version="1.0" encoding="UTF-8"?>
<stus Class="1401" >
	<stu num="01">
		<name>张三</name>
		<age>19</age>
		<sex>男</sex>
	</stu>
	<stu  num="02">
		<name>李四</name>
		<age>20</age>
		<sex>女</sex>
	</stu>
	<stu  num="03">
		<name>王五</name>
		<age>21</age>
		<sex>男</sex>
	</stu>
</stus>


三、开始解析
    创建解析工厂
Java代码 复制代码  收藏代码
  1. // 得到解析工厂对象  
  2.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  3.         // 生产一个解析器对象  
  4.         DocumentBuilder builder = factory.newDocumentBuilder();  
  5.         // 开始解析xml文件,得到的解析结果是一个Document对象,Document对象叫做文档树对象  
  6.         Document dom = builder.parse("stus.xml");  
// 得到解析工厂对象
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 生产一个解析器对象
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 开始解析xml文件,得到的解析结果是一个Document对象,Document对象叫做文档树对象
		Document dom = builder.parse("stus.xml");

    1、增加节点
    基本思路:首先创建一个新的元素节点,将元素节点追加到根节点后面,设置其节点属性。创建标签,设置标签文本内容,最后将新标签添加到新的元素节点中。
代码:
Java代码 复制代码  收藏代码
  1. // 创建一个新的元素节点  
  2.         Element stu = dom.createElement("stu");  
  3.         // 将元素节点追加到根节点后面  
  4.         root.appendChild(stu);  
  5.         // 设置节点属性  
  6.         stu.setAttribute("num""04");  
  7.         // 创建标签  
  8.         Element name = dom.createElement("name");  
  9.         Element age = dom.createElement("age");  
  10.         Element sex = dom.createElement("sex");  
  11.         // 设置标签文本内容  
  12.         name.setTextContent("赵六");  
  13.         age.setTextContent("19");  
  14.         sex.setTextContent("女");  
  15.         // 把标签添加到新的元素节点stu中  
  16.         stu.appendChild(name);  
  17.         stu.appendChild(age);  
  18.         stu.appendChild(sex);  
// 创建一个新的元素节点
		Element stu = dom.createElement("stu");
		// 将元素节点追加到根节点后面
		root.appendChild(stu);
		// 设置节点属性
		stu.setAttribute("num", "04");
		// 创建标签
		Element name = dom.createElement("name");
		Element age = dom.createElement("age");
		Element sex = dom.createElement("sex");
		// 设置标签文本内容
		name.setTextContent("赵六");
		age.setTextContent("19");
		sex.setTextContent("女");
		// 把标签添加到新的元素节点stu中
		stu.appendChild(name);
		stu.appendChild(age);
		stu.appendChild(sex);

    2、删除节点
基本思路:获得要删除的节点,然后得到节点的属性值,与要删除的节点的属性值进行比较,如果该属性值对应的节点存在则移除该节点。
代码:
Java代码 复制代码  收藏代码
  1. // 获得根节点  
  2.         Element root = (Element) dom.getFirstChild();  
  3.         // 获得所有stu节点  
  4.         NodeList list = dom.getElementsByTagName("stu");  
  5.         for (int i = 0; i < list.getLength(); i++) {  
  6.             Node node = list.item(i);  
  7.             if (node instanceof Element) {  
  8.                 Element e = (Element) node;  
  9.                 // 得到节点的属性值,与要删除的结点的属性值进行比较,然后移除该属性值对应的结点  
  10.                 String num = e.getAttribute("num");  
  11.                 if (num.equals("02")) {  
  12.                     root.removeChild(e);  
  13.                     break;  
  14.                 }  
  15.             }  
  16.         }  
// 获得根节点
		Element root = (Element) dom.getFirstChild();
		// 获得所有stu节点
		NodeList list = dom.getElementsByTagName("stu");
		for (int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
			if (node instanceof Element) {
				Element e = (Element) node;
				// 得到节点的属性值,与要删除的结点的属性值进行比较,然后移除该属性值对应的结点
				String num = e.getAttribute("num");
				if (num.equals("02")) {
					root.removeChild(e);
					break;
				}
			}
		}


    3、修改节点
基本思路:获得要修改的节点,修改其属性值,然后获得该节点下的标签,修改标签中的文本内容。
代码:

Java代码 复制代码  收藏代码
  1. // 修改节点属性  
  2.         for (int j = 0; j < list.getLength(); j++) {  
  3.             Node no = list.item(j);  
  4.             if (no instanceof Element) {  
  5.                 Element el = (Element) no;  
  6.                 String n = el.getAttribute("num");  
  7.                 if (n.contains("01")) {  
  8.                     el.setAttribute("num""05");  
  9.                     // 修改标签值  
  10.                     NodeList li = el.getChildNodes();  
  11.                     for (int x = 0; x < li.getLength(); x++) {  
  12.                         Node d = li.item(x);  
  13.                         if (d instanceof Element) {  
  14.                             Element ee = (Element) d;  
  15.                             String noN = ee.getNodeName();  
  16.                             if (noN.equals("name")) {  
  17.                                 ee.setTextContent("小白");  
  18.                             } else if (noN.equals("age")) {  
  19.                                 ee.setTextContent("11");  
  20.                             } else if (noN.equals("sex")) {  
  21.                                 ee.setTextContent("男");  
  22.                             }  
  23.                         }  
  24.                     }  
  25.                 }  
// 修改节点属性
		for (int j = 0; j < list.getLength(); j++) {
			Node no = list.item(j);
			if (no instanceof Element) {
				Element el = (Element) no;
				String n = el.getAttribute("num");
				if (n.contains("01")) {
					el.setAttribute("num", "05");
					// 修改标签值
					NodeList li = el.getChildNodes();
					for (int x = 0; x < li.getLength(); x++) {
						Node d = li.item(x);
						if (d instanceof Element) {
							Element ee = (Element) d;
							String noN = ee.getNodeName();
							if (noN.equals("name")) {
								ee.setTextContent("小白");
							} else if (noN.equals("age")) {
								ee.setTextContent("11");
							} else if (noN.equals("sex")) {
								ee.setTextContent("男");
							}
						}
					}
				}


4、查找节点
基本思路:获得所有的节点,用 需要查找的结点的属性值与所有节点进行比较,如果该节点存在,就打印该节点的属性值及其节点下标签的内容。
代码:
Java代码 复制代码  收藏代码
  1. for (int j = 0; j < list.getLength(); j++) {  
  2.     Node no = list.item(j);  
  3.     if (no instanceof Element) {  
  4.         Element el = (Element) no;  
  5.         String n = el.getAttribute("num");  
  6.         //查找节点,显示其属性值及标签内容  
  7.         if(n.equals("03")){  
  8.             System.out.println(no.getNodeName()+"\t"+n+no.getTextContent());  
  9.         }  
  10.     }  
  11. }  
		for (int j = 0; j < list.getLength(); j++) {
			Node no = list.item(j);
			if (no instanceof Element) {
				Element el = (Element) no;
				String n = el.getAttribute("num");
				//查找节点,显示其属性值及标签内容
				if(n.equals("03")){
					System.out.println(no.getNodeName()+"\t"+n+no.getTextContent());
				}
			}
		}



4、保存修改后的xml文档
基本思路:先将内存中的Document对象写到xml文件中,然后将整个Document对象作为要写入xml文件的数据源,最后将数据源写入目标文件。
代码:
Java代码 复制代码  收藏代码
  1. // 将内存中的Document对象写到xml文件中  
  2.         TransformerFactory tf = TransformerFactory.newInstance();  
  3.         Transformer former = tf.newTransformer();  
  4.         former.setParameter("version""1.0");  
  5.         former.setParameter("encoding""GBK");  
  6.         // 将整个Document对象作为要写入xml文件的数据源  
  7.         DOMSource xmlSource = new DOMSource(dom);  
  8.         // 要写入的目标文件  
  9.         StreamResult outputTarget = new   
  10.                 StreamResult(new File("F:\\stus2.xml"));  
  11.         former.transform(xmlSource, outputTarget);  
如果需要源码可以发送邮件到sdiwen1982@sohu.com索取 /*************************************** 功能:读取xml文件 参数:[in] xml文件路径 返回:true读取成功 false读取失败 **************************************/ bool ReadXml(CString sXmlPath /*xml文件路径*/); /*************************************** 功能:写入xml文件 参数:[in] xml文件路径 返回:true写入成功 false写入失败 **************************************/ bool WriteXml(CString sXmlPath /*xml文件路径*/); /*************************************** 功能:释放空间 参数:无 返回:无 **************************************/ void Release(); /*************************************** 功能:删除指定的节点 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteNode(); /*************************************** 功能:删除当前节点的所有子节点,当前节点不删除 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAllSon(); /*************************************** 功能:根据索引删除子节点 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteSonByIndex(unsigned int nIndex); /*************************************** 功能:删除节点所有属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAllAttr(); /*************************************** 功能:根据属性名删除属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAttrByName(CString sName); /*************************************** 功能:根据索引删除属性 参数:无 返回:true删除成功 false删除失败 **************************************/ bool DeleteAttrByIndex(unsigned int nIndex); /*************************************** 功能:根据属性名设置属性值 参数:[in] sName 属性名 [in] sValue 属性值 返回:true设置成功 false设置失败 **************************************/ bool SetAttrValueByName(CString sName, CString sValue); /*************************************** 功能:插入属性 参数:[in] sName 属性名 [in] sValue 属性值 返回:true插入成功 false插入失败 **************************************/ bool InsertAttr(CString sName, CString sValue); /*************************************** 功能:设置节点值 参数:[in] sValue 属性值 返回:true设置节点值成功 false设置节点值失败 **************************************/ bool SetNodeValue(CString sValue); /*************************************** 功能:插入子节点 参数:[in] sName 节点名 返回:非空表示插入节点成功,返回插入的新节点指针 空表示插入失败 **************************************/ CXMLNode * InsertNode(CString sName); /*************************************** 功能:判断是否存在子节点 参数:[in] pNode 子节点文件指针, 返回:false没有子节点 true有子节点 **************************************/ bool HasChild(MSXML2::IXMLDOMNodePtr pNode);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值