SAX解析XML教程

前端之家收集整理的这篇文章主要介绍了SAX解析XML教程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SAX解析XML教程

加载XML文档文件

  1. 首先导入相关套件
  1. import org.xml.sax.*;
  1. 在JAXP中,DOM解析器称为DocumentBulider,可以通过工厂类DocumentBuliderFactory获得,而document对象则可以通过类DocumentBulider获得。
  1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. try {
  3. DocumentBuilder db = dbf.newDocumentBuilder();
  4. document = db.parse(file); // file为xml文件
  5. } catch (ParserConfigurationException | SAXException | IOException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. }

3.获取接口类document实例后,就可以对DOM的文档树进行访问。如要遍历DOM文档,首先获取根节点,然后获得根结点的子结点列表

  1. // 获取根结点
  2. Element root= document.getDocumentElement();
  3. // 获取根结点点子结点列表
  4. NodeList rootlist = document.getChildNodes();

设定加载XML文件的参数

|方法 |说明
|setCoalesing(boolen) |设置解析器CDATA结点转换成TEXT文字结点和新增在其相邻文字结点之后(如果有的话),默认为 false,true表示转换
|setExpandEntityReferencedes(boolen) |设置解析器展开实体参考的结点,默认为true表示展开,false表示不展开
|setIgnoreComments(boolen) |设置解析器忽略注释文字,默认为false,true表示不忽略
|SetIgnoringElementContentWhitespace(boolen) |设置解析器忽略元素内容为whitespace空白字节的结点,默认为false,true表示忽略

访问XML元素和属性

XML文档中常见的结点类型
结点类型|说明
NODE_DOCUMENT_TYPE|
NODE_PROCESSING_INSTRUCTION|

使用DOM创建XML文档

1) 创建XML文档

  1. Document document = db.newDocument();

2) 创建新的结点
方法 |说明
createElement(string) | 建立XML元素的结点,参数为标记名称
createAttribute(string) | 建立属性名称属性结点,参数是属性名称
createCDATASection(string) | 建立CDATA块,参数是文字内容
createComment(string) | 建立注释文字结点,参数为注释文字内容
createTextNode(string) | 建立文字结点,参数为内容
createEntityReference(string) | 建立实体参考,参数为实体参考名称
createProcessingInstring(string,string) | 建立PI结点,第一个参数是PI名称,第二个为值

3) 指定插入位置
在建立好XML元素的对象后,可以使用Node结点对象的方法添加到DOM树中
appendChild(newnode),新添加一个newnode结点
insertBefore(newnode,befnode),将newnode结点插到befnode结点前

4) 新增元素内容
使用createTextNode方法建立文字结点后,再使用appendChild方法将它添加到元素结点中。

5) 新增元素属性
可使用setAttribute方法给Element元素对象增加属性

6) 删除元素或属性
如果删除节点可使用Node结点的removeChild方法删除指定的结点,如果删除属性可使用Element元素对象的removeAttribute方法删除

示例代码

  1. Element name = document.createElementNS("","name"); // Element元素
  2. name.setTextContent(shiptoMap.get("name")); // 添加内容
  3. shipto.appendChild(name); // 将name添加到shipto结点
  4.  
  5. Element order = document.createElementNS("","order");
  6. order.setAttributeNS("","orderid","20160101"); // 添加属性 Element继承于Node有此方法,Node无此方法
  7.  
  8. Node title = document.createElementNS("","title"); // Node结点
  9. title.setTextContent(map.get("title")); // 添加内容
  10. newcd.appendChild(title); // 将title结点添加到CD结点
  11.  
  12. root.removeChild(cd); // 删除结点

以下为具体实例

  1. package xmlwork;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.StringWriter;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import javax.xml.parsers.DocumentBuilder;
  12. import javax.xml.parsers.DocumentBuilderFactory;
  13. import javax.xml.parsers.ParserConfigurationException;
  14. import javax.xml.transform.OutputKeys;
  15. import javax.xml.transform.Transformer;
  16. import javax.xml.transform.TransformerConfigurationException;
  17. import javax.xml.transform.sax.SAXTransformerFactory;
  18. import javax.xml.transform.sax.TransformerHandler;
  19. import javax.xml.transform.stream.StreamResult;
  20. import org.w3c.dom.Document;
  21. import org.w3c.dom.Element;
  22. import org.w3c.dom.NamedNodeMap;
  23. import org.w3c.dom.Node;
  24. import org.w3c.dom.NodeList;
  25. import org.xml.sax.SAXException;
  26. import org.xml.sax.helpers.AttributesImpl;
  27.  
  28. public class sax {
  29.  
  30. /** * 解析XML * @param filepath * @return */
  31. public Document analysis(String filepath) {
  32. Document document = null;
  33. File file = new File(filepath);
  34.  
  35. if(!file.exists()){
  36. System.out.println("File is wrong!");
  37. return null;
  38. }
  39.  
  40. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  41. try {
  42. DocumentBuilder db = dbf.newDocumentBuilder();
  43. document = db.parse(file);
  44. } catch (ParserConfigurationException | SAXException | IOException e) {
  45. // TODO Auto-generated catch block
  46. System.out.println("Analysis is wrong!");
  47. e.printStackTrace();
  48. return null;
  49. }
  50.  
  51. return document;
  52. }
  53.  
  54. /** * 新增订单信息 * @param filepath * @param orderMap * @param shiptoMap * @param list */
  55. @SuppressWarnings("unused")
  56. private void insertOrder(String filepath,HashMap<String,String> orderMap,String> shiptoMap,List<HashMap<String,String>> list) {
  57. // TODO Auto-generated method stub
  58. Document document = analysis(filepath);
  59. Element root = null;
  60.  
  61. if(document!=null){
  62. root = document.getDocumentElement();
  63. Element order = document.createElementNS("","order");
  64. order.setAttributeNS("",orderMap.get("orderid"));
  65. order.setAttributeNS("","orderdate",orderMap.get("orderdate"));
  66.  
  67. Element orderperson = document.createElementNS("","orderperson");
  68. orderperson.setTextContent(orderMap.get("orderperson"));
  69.  
  70. Element shipto = document.createElementNS("","shipto");
  71. Element name = document.createElementNS("","name");
  72. Element address = document.createElementNS("","address");
  73. Element city = document.createElementNS("","city");
  74. Element country = document.createElementNS("","country");
  75. Element phone = document.createElementNS("","phone");
  76.  
  77. name.setTextContent(shiptoMap.get("name"));
  78. address.setTextContent(shiptoMap.get("address"));
  79. city.setTextContent(shiptoMap.get("city"));
  80. country.setTextContent(shiptoMap.get("country"));
  81. phone.setTextContent(shiptoMap.get("phone"));
  82.  
  83. shipto.appendChild(name);
  84. shipto.appendChild(address);
  85. shipto.appendChild(city);
  86. shipto.appendChild(country);
  87. shipto.appendChild(phone);
  88.  
  89. Element items = document.createElementNS("","items");
  90. for(HashMap<String,String>itemMap : list){
  91. Element item = document.createElementNS("","item");
  92.  
  93. Element title = document.createElementNS("","title");
  94. Element id = document.createElementNS("","id");
  95. Element quantity = document.createElementNS("","quantity");
  96. Element price = document.createElementNS("","price");
  97.  
  98. title.setTextContent(itemMap.get("title"));
  99. id.setTextContent(itemMap.get("id"));
  100. quantity.setTextContent(itemMap.get("quantity"));
  101. price.setTextContent(itemMap.get("price"));
  102.  
  103. item.appendChild(title);
  104. item.appendChild(id);
  105. item.appendChild(quantity);
  106. item.appendChild(price);
  107.  
  108. items.appendChild(item);
  109. }
  110.  
  111. order.appendChild(orderperson);
  112. order.appendChild(shipto);
  113. order.appendChild(items);
  114.  
  115. root.appendChild(order);
  116. System.out.println("已添加订单");
  117. }
  118.  
  119. //执行写入文件
  120. if(!saxToxml(root,filepath))System.out.println("写入文件出错!");
  121. }
  122.  
  123. /** * 添加一张CD(唱片)信息 * @param filepath * @param map */
  124. @SuppressWarnings("unused")
  125. private void insertCD(String filepath,String> map) {
  126. // TODO Auto-generated method stub
  127. Document document = analysis(filepath);
  128. Node root = null;
  129.  
  130. if(document!=null){
  131. root = document.getDocumentElement();
  132. Node newcd = document.createElementNS("","cd");
  133. Node title = document.createElementNS("","title");
  134. title.setTextContent(map.get("title"));
  135. Node artist = document.createElementNS("","artist");
  136. artist.setTextContent(map.get("artist"));
  137. Node country = document.createElementNS("","country");
  138. country.setTextContent(map.get("country"));
  139. Node company = document.createElementNS("","company");
  140. company.setTextContent(map.get("company"));
  141. Node price = document.createElementNS("","price");
  142. price.setTextContent(map.get("price"));
  143. Node year = document.createElementNS("","year");
  144. year.setTextContent(map.get("year"));
  145. Node photo = document.createElementNS("","photo");
  146. photo.setTextContent(map.get("photo"));
  147. Node quantity = document.createElementNS("","quantity");
  148. quantity.setTextContent(map.get("quantity"));
  149. root.appendChild(newcd);
  150. newcd.appendChild(title);
  151. newcd.appendChild(artist);
  152. newcd.appendChild(country);
  153. newcd.appendChild(company);
  154. newcd.appendChild(price);
  155. newcd.appendChild(year);
  156. newcd.appendChild(photo);
  157. newcd.appendChild(quantity);
  158. System.out.println("已添加 title为 "+map.get("title")+"CD条目");
  159. }
  160. //执行写入文件
  161. if(!saxToxml(root,filepath))System.out.println("写入文件出错!");
  162. }
  163.  
  164. /** * 更新一张CD(唱片)信息(根据title) * @param filepath * @param map */
  165. @SuppressWarnings("unused")
  166. private void updateCD(String filepath,String> map) {
  167. // TODO Auto-generated method stub
  168. Document document = analysis(filepath);
  169. String str_title = map.get("title");
  170. Node root = null;
  171.  
  172. if(document!=null){
  173. root = document.getDocumentElement();
  174. NodeList cds = root.getChildNodes();
  175. for(int i=0;i<cds.getLength();i++){
  176. boolean flag = false;
  177. Node cd = cds.item(i);
  178. short nodetype = cd.getNodeType();
  179. if(nodetype==Node.ELEMENT_NODE){
  180. if(cd.hasChildNodes()){
  181. NodeList infos = cd.getChildNodes();
  182. for(int j=0;j<infos.getLength();j++){
  183. Node info = infos.item(j);
  184. short titleType = info.getNodeType();
  185. if(titleType==Node.ELEMENT_NODE){
  186. if(info.getNodeName().equals("title")){
  187. if(info.getTextContent().equals(str_title)){
  188. flag = true;
  189. }
  190. }
  191. if(flag){
  192. if(info.getNodeName().equals("artist")){
  193. info.setTextContent(map.get("artist"));
  194. System.out.println("已更新title为 "+str_title+" 的CD的artist条目为"+map.get("artist"));
  195. }
  196. if(info.getNodeName().equals("country")){
  197. info.setTextContent(map.get("country"));
  198. System.out.println("已更新title为 "+str_title+" 的CD的country条目为"+map.get("country"));
  199. }
  200. if(info.getNodeName().equals("company")){
  201. info.setTextContent(map.get("company"));
  202. System.out.println("已更新title为 "+str_title+" 的CD的company条目为"+map.get("company"));
  203. }
  204. if(info.getNodeName().equals("price")){
  205. info.setTextContent(map.get("price"));
  206. System.out.println("已更新title为 "+str_title+" 的CD的price条目为"+map.get("price"));
  207. }
  208. if(info.getNodeName().equals("year")){
  209. info.setTextContent(map.get("year"));
  210. System.out.println("已更新title为 "+str_title+" 的CD的year条目为"+map.get("year"));
  211. }
  212. if(info.getNodeName().equals("photo")){
  213. info.setTextContent(map.get("photo"));
  214. System.out.println("已更新title为 "+str_title+" 的CD的photo条目为"+map.get("photo"));
  215. }
  216. if(info.getNodeName().equals("quantity")){
  217. info.setTextContent(map.get("quantity"));
  218. System.out.println("已更新title为 "+str_title+" 的CD的quantity条目为"+map.get("quantity"));
  219. }
  220. }
  221. }
  222. }
  223. }
  224. }
  225. }
  226. }
  227. //执行写入文件
  228. if(!saxToxml(root,filepath))System.out.println("写入文件出错!");
  229. }
  230.  
  231. /** * 删除一条CD(唱片)信息(根据title) * @param filepath * @param map */
  232. @SuppressWarnings("unused")
  233. private void deleteCD(String filepath,String> map) {
  234. // TODO Auto-generated method stub
  235. Document document = analysis(filepath);
  236. String str_title = map.get("title");
  237. Node root = null;
  238.  
  239. if(document!=null){
  240. root = document.getDocumentElement();
  241. NodeList cds = root.getChildNodes();
  242. for(int i=0;i<cds.getLength();i++){
  243. Node cd = cds.item(i);
  244. short nodetype = cd.getNodeType();
  245. if(nodetype==Node.ELEMENT_NODE){
  246. if(cd.hasChildNodes()){
  247. NodeList infos = cd.getChildNodes();
  248. for(int j=0;j<infos.getLength();j++){
  249. Node info = infos.item(j);
  250. short titleType = info.getNodeType();
  251. if(titleType==Node.ELEMENT_NODE){
  252. if(info.getNodeName().equals("title")){
  253. if(info.getTextContent().equals(str_title)){
  254. root.removeChild(cd);
  255. System.out.println("已删除 title为 "+str_title+" CD条目");
  256. }
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. }
  264. //执行写入文件
  265. if(!saxToxml(root,filepath))System.out.println("写入文件出错!");
  266. }
  267.  
  268. /** * 将document信息写入到文件中 * @param root * @param filepath * @return */
  269. private boolean saxToxml(Node root,String filepath) {
  270. // TODO Auto-generated method stub
  271. StringWriter stringWriter = new StringWriter();
  272. SAXTransformerFactory sff = null;
  273. TransformerHandler handler = null;
  274. Transformer transformer = null;
  275. StreamResult result = null;
  276. try {
  277. sff = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
  278. handler = sff.newTransformerHandler();
  279. transformer = handler.getTransformer();
  280. //设置编码格式
  281. transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
  282. //设置自动添加空白
  283. transformer.setOutputProperty(OutputKeys.INDENT,"yes");
  284. transformer.setOutputProperty(OutputKeys.VERSION,"1.0");
  285. //保存XML
  286. result = new StreamResult(stringWriter);
  287. handler.setResult(result);
  288. //开始XML
  289. handler.startDocument();
  290. //设置属性
  291. AttributesImpl attrsImpl = new AttributesImpl();
  292. attrsImpl.clear();
  293.  
  294. handler.startElement("","",root.getNodeName(),null);
  295. handler = getChilds(handler,attrsImpl,root.getChildNodes());
  296. handler.endElement("",root.getNodeName());
  297. } catch (TransformerConfigurationException e) {
  298. // TODO Auto-generated catch block
  299. e.printStackTrace();
  300. } catch (SAXException e) {
  301. // TODO Auto-generated catch block
  302. e.printStackTrace();
  303. }
  304.  
  305. System.out.println(stringWriter.toString());
  306.  
  307. try {
  308. FileOutputStream out = new FileOutputStream(new File(filepath));
  309. out.write(stringWriter.toString().getBytes());
  310. out.close();
  311. } catch (FileNotFoundException e) {
  312. // TODO Auto-generated catch block
  313. e.printStackTrace();
  314. return false;
  315. } catch (IOException e) {
  316. // TODO Auto-generated catch block
  317. e.printStackTrace();
  318. return false;
  319. }
  320.  
  321. return true;
  322. }
  323.  
  324. /** * 递归遍历子节点 * @param handler * @param attrsImpl * @param nodelist * @return */
  325. private TransformerHandler getChilds(TransformerHandler handler,AttributesImpl attrsImpl,NodeList nodelist) {
  326. // TODO Auto-generated method stub
  327. try {
  328. for(int m=0;m<nodelist.getLength();m++){
  329. Node node = nodelist.item(m);
  330. short nodetype = node.getNodeType(); //得到节点的类型,可以是ElementNode,TextNode,DocumentNode等
  331.  
  332. //System.out.println("name="+node.getNodeName());
  333. if(nodetype==Node.ELEMENT_NODE){
  334.  
  335. //遍历属性
  336. if(node.hasAttributes()){
  337. NamedNodeMap attrs = node.getAttributes();
  338. for(int i=0;i<attrs.getLength();i++){
  339. attrsImpl.addAttribute("",attrs.item(i).getNodeName(),attrs.item(i).getNodeValue());
  340. }
  341. }
  342.  
  343. handler.startElement("",node.getNodeName(),attrsImpl);
  344. attrsImpl.clear();
  345.  
  346. //遍历子节点
  347. if(node.hasChildNodes()){
  348. handler = getChilds(handler,node.getChildNodes());
  349. }else{
  350. handler.characters(node.getTextContent().tocharArray(),0,node.getTextContent().length());
  351. // System.out.println("==TextContent="+node.getTextContent());
  352. }
  353.  
  354. handler.endElement("",node.getNodeName());
  355. }
  356.  
  357. //Text类型节点没有子节点,节点名字为#test,节点值为XML文档中元素的值
  358. if(nodetype==Node.TEXT_NODE){
  359. Node parent = node.getParentNode();
  360. Node txtnode = parent.getChildNodes().item(0);
  361. handler.characters(txtnode.getNodeValue().tocharArray(),txtnode.getNodeValue().length());
  362. // System.out.println("TEXT_NODE="+txtnode.getNodeValue().trim());
  363. }
  364. }
  365. } catch (SAXException e) {
  366. // TODO Auto-generated catch block
  367. e.printStackTrace();
  368. }
  369.  
  370. return handler;
  371. }
  372.  
  373. private void queryOrder(String filepath,String time) {
  374. // TODO Auto-generated method stub
  375. int ordernum=0;
  376. int quantity=0,sum = 0;
  377. float price=0.0F;
  378. Document document = analysis(filepath);
  379. Node root = null;
  380. boolean flag = false;
  381.  
  382. if(document!=null){
  383. root = document.getDocumentElement();
  384. NodeList orders = root.getChildNodes();
  385. for(int i=0;i<orders.getLength();i++){
  386. Node order = orders.item(i);
  387. //遍历属性
  388. if(order.hasAttributes()){
  389. NamedNodeMap attrs = order.getAttributes();
  390. for(int m=0;m<attrs.getLength();m++){
  391. if(attrs.item(m).getNodeName().equals("orderdate")){
  392. //年月一样,遍历Ite并得到总价
  393. if(attrs.item(m).getNodeValue().contains(time)){
  394. System.out.println("Time:"+attrs.item(m).getNodeValue());
  395. flag = true;
  396. ordernum++;
  397. }
  398. }
  399. }
  400.  
  401. if(!flag)continue;
  402. NodeList infos = order.getChildNodes();
  403. for(int j=0;j<infos.getLength();j++){
  404. Node info = infos.item(j);
  405. if(!info.getNodeName().equals("items"))continue;
  406. NodeList items = info.getChildNodes();
  407. for(int k=0;k<items.getLength();k++){
  408. NodeList properties = items.item(k).getChildNodes();
  409. for(int m=0;m<properties.getLength();m++){
  410. Node nodeQ = properties.item(m);
  411.  
  412. if(nodeQ.getNodeType()==Node.ELEMENT_NODE){
  413.  
  414. if(nodeQ.getNodeName().equals("quantity")){
  415. // System.out.println(nodeQ.getNodeName()+"=="+nodeQ.getTextContent());
  416. quantity = Integer.parseInt(nodeQ.getTextContent());
  417. }
  418. if(nodeQ.getNodeName().equals("price")){
  419. // System.out.println(nodeQ.getNodeName()+"=="+nodeQ.getTextContent());
  420. price = Float.parseFloat(nodeQ.getTextContent());
  421. }
  422. }
  423. }
  424. sum+=quantity*price;
  425. quantity=0;
  426. price=0;
  427. }
  428. }
  429. }
  430. }
  431. System.out.println(time+"月共有"+ordernum+"个订单,交易金额为"+sum+"元");
  432. }
  433. }
  434.  
  435. public static void main(String[] args) {
  436. HashMap<String,String> map = new HashMap<String,String>();
  437. map.put("title","36");
  438. map.put("artist","11");
  439. map.put("country","11");
  440. map.put("price","11");
  441. map.put("year","15");
  442. map.put("photo","15");
  443. //测试新增CD信息
  444. // new sax().insertCD("G://disc.xml",map);
  445. //测试更新CD信息
  446. // new sax().updateCD("G://disc.xml",map);
  447. //测试删除CD信息
  448. // new sax().deleteCD("G://disc.xml",map);
  449.  
  450. HashMap<String,String> orderMap = new HashMap<String,String>();
  451. orderMap.put("orderid","2013264444203");
  452. orderMap.put("orderdate","2021-05-05");
  453. orderMap.put("orderperson","coffee");
  454. HashMap<String,String> shiptoMap = new HashMap<String,String>();
  455. shiptoMap.put("name","Licy");
  456. shiptoMap.put("address","贝利街");
  457. shiptoMap.put("city","纽约");
  458. shiptoMap.put("country","美国");
  459. shiptoMap.put("phone","11123459999");
  460. List<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
  461. HashMap<String,String> item1 = new HashMap<String,String>();
  462. item1.put("title","狗镇");
  463. item1.put("id","2937774");
  464. item1.put("quantity","377373");
  465. item1.put("price","233.00");
  466. HashMap<String,String> item2 = new HashMap<String,String>();
  467. item2.put("title","夏洛特烦恼");
  468. item2.put("id","445645");
  469. item2.put("quantity","6664444");
  470. item2.put("price","444.44");
  471. list.add(item1);
  472. list.add(item2);
  473. //测试新增订单信息
  474. // new sax().insertOrder("G://order.xml",orderMap,shiptoMap,list);
  475.  
  476. new sax().queryOrder("G://order.xml","2015-11");
  477. }
  478.  
  479. }

XML order.xml文件信息

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <?xml-stylesheet type="text/xsl" href="order.xslt"?>
  3. <shiporder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd">
  4. <order orderid="2015261020278" orderdate="2015-11-20">
  5. <orderperson>cs</orderperson>
  6. <shipto>
  7. <name>coffee</name>
  8. <address>师范学院</address>
  9. <city>鄂州</city>
  10. <country>中国</country>
  11. <phone>13094278550</phone>
  12. </shipto>
  13. <items>
  14. <item>
  15. <title>权利的游戏</title>
  16. <id>20151120</id>
  17. <quantity>1</quantity>
  18. <price>200.00</price>
  19. </item>
  20. </items>
  21. </order>
  22. <order orderid="2015261020206" orderdate="2015-12-12">
  23. <orderperson>李磊</orderperson>
  24. <shipto>
  25. <name>ivan</name>
  26. <address>师范学院</address>
  27. <city>武汉</city>
  28. <country>中国</country>
  29. <phone>13298845263</phone>
  30. </shipto>
  31. <items>
  32. <item>
  33. <title>硅谷之火</title>
  34. <id>250144</id>
  35. <quantity>1</quantity>
  36. <price>245.00</price>
  37. </item>
  38. <item>
  39. <title>暗黑者</title>
  40. <id>36254</id>
  41. <quantity>2</quantity>
  42. <price>123.00</price>
  43. </item>
  44. </items>
  45. </order>
  46. </shiporder>

XML disc.xml信息

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <cdcatalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="cdcatalog.xsd">
  3. <cd>
  4. <title>准备中</title>
  5. <artist>张智霖</artist>
  6. <country>中国香港</country>
  7. <company></company>
  8. <price>499.00</price>
  9. <year>2008</year>
  10. <photo>12345678901</photo>
  11. <quantity>1000000</quantity>
  12. </cd>
  13. <cd>
  14. <title>21</title>
  15. <artist>Adele</artist>
  16. <country>美国</country>
  17. <company>XL Recordings、Columbia </company>
  18. <price>222.00</price>
  19. <year>2011</year>
  20. <photo>13456789001</photo>
  21. <quantity>1000000</quantity>
  22. </cd>
  23. <cd>
  24. <title>25</title>
  25. <artist>Adele</artist>
  26. <country>美国</country>
  27. <company>XL Recordings、Columbia </company>
  28. <price>222.00</price>
  29. <year>2015</year>
  30. <photo>13207873749</photo>
  31. <quantity>1000000</quantity>
  32. </cd>
  33. </cdcatalog>

猜你在找的XML相关文章