xml小结

《XML》实验(1) -- XML Basics & DTD [实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、预定义实体、命名空间的使用,以及如何进行XML文档良构和有效性验证;能够灵活地使用XML层次数据来表示各种信息。 3、掌握如何在DTD文档中声明元素及其内容模型、属性,以及实体的声明和使用;使用内部/外部DTD规则,对XML数据文档的有效性进行约束。 某软件学院XML课程实验答案 立即下载

一、XML入门
1.XML概述
   XML(Extensible Markup Language):可扩展标记语言.
   XML和HTML都是标准通用标记语言(Standard Generalized Markup Language,SGML)的衍生语言.
   XML没有预定义标签.
   XML的应用:存储和传输复杂的关系模型数据
    在软件系统中,作为配置文件使用.
2.XML语法
   * 文档声明
       格式:<?xml version="1.0"?> 
       encoding:设置当前xml文档内容使用的编码.
       standalone:说明文档是否独立.
   * 元素
       格式:<x></x> 或者 <x />
       名称自定义:严格区分大小写,<P>和<p>是不同的标记
           不能以数字或"_"开头,建议以字母开头
           不能以xml或XML或Xml等开头
           不能包含空格,例<a b>
           不能包含冒号,例<a:b>
           注意:不能交叉嵌套
            有且仅有一个根标签.
   * 属性
         前提:在某元素的基础上,确定相应的属性.
         格式:<x attribute="attrValue" />
         注意:一个标签可以有多个属性,属性值要用双引号或单引号括起来.
   * 注释
         格式:<!--注释内容-->
   * CDATA区、特殊字符
         在xml文档中存放任意内容的区域
         格式:<![CDATA[ 存放的cdata内容,会以原样输出 ]]>
         转义字符:对于一些单个字符,若想显示原始样式,除了cdata也可以用转移的形式
         例如: 特殊字符   替代符号
              &  &amp;
              <  &lt;
              >  &gt;
              "  &quot;
              '  &apos;
            具体可查文档
   * 处理指令(processing instruction,PI)
         它是用来指挥解析引擎如何解析XML文档内容.
         处理指令必须以 <? 开头,以  ?> 作为结尾,XML声明语句就是最常见的一种处理指令.
         例如:引入css文件等
         格式:<?xml-stylesheet type="text/css" href="uri" ?>
        type:类型,内容是MIME类型,例 image/jpeg
        href:确定引用文件的位置
         uri:统一资源标识符 1.html  news/m.html
         url:统一资源定位符 http://www.fengjie.com/news/m.html
二、XML约束
1.概述
    XML约束:编写一个文档来约束一个xml文档的书写规范.
    常用的约束技术:    XML DTD(Document Type Definition)
                                     XML Schema
2.DTD约束
   (1)文档 关联
       * 内部关联
             即在xml文件内部书写DTD规范
             格式:<!DOCTYPE 根元素  [..具体规范内容..]>
       * 外部关联
             即引用的文件不在xml文件内部,而是在本地
             格式:在xml文件内写  <!DOCTYPE 根元素  SYSTEM "DTD文件的URL">
             例如:<!DOCTYPE books SYSTEM "book.dtd">
      * 公共关联
            即引用的文件不在本地
            格式:<DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
  (2)DTD约束语法
      * 元素
            格式:<!ELEMENT 元素名称  元素内容声明>
            注意:其中元素内容声明包含符号和数据类型两部分!
            符号:? 0次或1次
                       *  >=0次
                       +  >=1次
                       ()  分组
                        |  选择
                       ,  顺序出现
            类型:#PCDATA 只能书写字符,不能包含子元素.注意书写格式:(#PCDATA)
                       EMPTY 元素内容为空
                      AND  元素内容任意
    * 属性
         格式:<!ATTLIST 元素名称
                         属性名  属性类型  约束
                         属性名  属性类型  约束
                          ...
                   >
         属性类型:CDATA  值为字符数据
                            ID  值为唯一的id
                            ()  选择
                          ..其他具体查看文档
        约束的四种形式:
             #REQUIRED  必须填写
             #IMPLIED  可选
             #FIXED value 固定值(value为自己设置的一个固定值)
             DefaultValue 默认值
   *实体(内部实体与外部实体,它们与关联方式无关)
    内部实体
        引用实体
             格式:<!ENTITY 实体名称  "实体内容">
             引用方式:&实体名称;  用在xml中
       参数实体
             格式:<!ENTITY % 实体名称  "实体内容">
             引用方式:%实体名称;  留给DTD文件本身使用的.
    外部实体
            格式:<!ENTITY 实体名称  SYSTEM "URI/URL">
            引用方式:&实体名称;  用在xml中
  (3)DTD约束代码示例

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!-- 文档内部关联DTD --> 
  3. <!DOCTYPE NEWSPAPER [  
  4.  
  5. <!ELEMENT NEWSPAPER (ARTICLE+)> 
  6. <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> 
  7. <!ELEMENT HEADLINE (#PCDATA)> 
  8. <!ELEMENT BYLINE (#PCDATA)> 
  9. <!ELEMENT LEAD (#PCDATA)> 
  10. <!ELEMENT BODY (#PCDATA)> 
  11. <!ELEMENT NOTES (#PCDATA)> 
  12.   
  13. <!--#REQUIRED必须填写,#IMPLIED可以写可以不写--> 
  14. <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> 
  15. <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> 
  16. <!ATTLIST ARTICLE DATE CDATA #IMPLIED> 
  17. <!ATTLIST ARTICLE EDITION CDATA #IMPLIED> 
  18.  
  19. <!--引用实体,用于xml文档中--> 
  20. <!ENTITY NEWSPAPER "Vervet Logic Times"> 
  21. <!ENTITY PUBLISHER "Vervet Logic Press"> 
  22. <!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press"> 
  23.  
  24. ]> 
  25. <NEWSPAPER> 
  26.     <ARTICLE AUTHOR="&PUBLISHER;" DATE="9.15"> 
  27.         <HEADLINE>&NEWSPAPER;</HEADLINE> 
  28.         <BYLINE>science fiction film</BYLINE> 
  29.         <LEAD>...</LEAD> 
  30.         <BODY>the file is very good</BODY> 
  31.         <NOTES>©RIGHT;</NOTES> 
  32.     </ARTICLE> 
  33. </NEWSPAPER> 
			<?xml version="1.0" encoding="UTF-8"?>
			<!-- 文档内部关联DTD -->
			<!DOCTYPE NEWSPAPER [ 
			
			<!ELEMENT NEWSPAPER (ARTICLE+)>
			<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
			<!ELEMENT HEADLINE (#PCDATA)>
			<!ELEMENT BYLINE (#PCDATA)>
			<!ELEMENT LEAD (#PCDATA)>
			<!ELEMENT BODY (#PCDATA)>
			<!ELEMENT NOTES (#PCDATA)>
			 
			<!--#REQUIRED必须填写,#IMPLIED可以写可以不写-->
			<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
			<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
			<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
			<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
			
			<!--引用实体,用于xml文档中-->
			<!ENTITY NEWSPAPER "Vervet Logic Times">
			<!ENTITY PUBLISHER "Vervet Logic Press">
			<!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press">
			
			]>
			<NEWSPAPER>
				<ARTICLE AUTHOR="&PUBLISHER;" DATE="9.15">
					<HEADLINE>&NEWSPAPER;</HEADLINE>
					<BYLINE>science fiction film</BYLINE>
					<LEAD>...</LEAD>
					<BODY>the file is very good</BODY>
					<NOTES>©RIGHT;</NOTES>
				</ARTICLE>
			</NEWSPAPER>

3.Schema约束
  (1)在XML文档中引用Schema

  1. <!--books.xsd内容如下:--> 
  2. <?xml version="1.0" encoding="UTF-8"?> 
  3. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  4.     targetNamespace="http://www.example.org/books"  
  5.     xmlns:tns="http://www.example.org/books"  
  6.     elementFormDefault="qualified"> 
  7.     ... 
  8.     ... 
  9. </xs:schema> 
			<!--books.xsd内容如下:-->
			<?xml version="1.0" encoding="UTF-8"?>
			<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
				targetNamespace="http://www.example.org/books" 
				xmlns:tns="http://www.example.org/books" 
				elementFormDefault="qualified">
				...
				...
			</xs:schema>

   解释:* xmlns(xml namespace)
      应用已有的命名空间,http://www.w3.org/2001/XMLSchema
          官方为自己的schema文档起的名称
      格式1:xmlns:别名
        xmlns:xs
        使用:xs:schema,从当前别名xs所代表的schema文档中定义了schema元素
      格式2:xmlns(默认命名空间引用)
    * targetNamespace
      为当前的schema文档命名,必须全球唯一,采用URL的形式

  1. <!-- books.xml文档中的内容:--> 
  2. <?xml version="1.0" encoding="UTF-8"?> 
  3. <books  xmlns="http://www.example.org/books" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://www.example.org/books books.xsd"> 
  6. </books> 
			<!-- books.xml文档中的内容:-->
			<?xml version="1.0" encoding="UTF-8"?>
			<books  xmlns="http://www.example.org/books"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://www.example.org/books books.xsd">
			</books>


   解释:* xmlns="http://www.example.org/books"
      确定需要的schema文档的名称  
    * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      将当前xml文档实例化,这样才能使用schemaLocation属性确定其位置
    * xsi:schemaLocation="http://www.example.org/books books.xsd"
      通知xml解析器,自己文档的名称和位置,用空格隔开
  (2)代码示例(引用w3c中的示例)

  1. <!-- shiporder.xml文档的内容:--> 
  2. <?xml version="1.0" encoding="UTF-8"?> 
  3. <shiporder orderid="889923" 
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5. xsi:noNamespaceSchemaLocation="shiporder.xsd"> 
  6. <orderperson>George Bush</orderperson> 
  7. <shipto> 
  8.   <name>John Adams</name> 
  9.   <address>Oxford Street</address> 
  10.   <city>London</city> 
  11.   <country>UK</country> 
  12. </shipto> 
  13. <item> 
  14.   <title>Empire Burlesque</title> 
  15.   <note>Special Edition</note> 
  16.   <quantity>1</quantity> 
  17.   <price>10.90</price> 
  18. </item> 
  19. <item> 
  20.   <title>Hide your heart</title> 
  21.   <quantity>1</quantity> 
  22.   <price>9.90</price> 
  23. </item> 
  24. </shiporder> 
  25.  
  26. <!--schema文件内容:--> 
  27.  
  28. <?xml version="1.0" encoding="UTF-8"?> 
  29. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
  30.  
  31.     <!-- 简易元素的定义 --> 
  32.     <xs:element name="orderperson" type="xs:string" /> 
  33.     <xs:element name="name" type="xs:string" /> 
  34.     <xs:element name="address" type="xs:string" /> 
  35.     <xs:element name="city" type="xs:string" /> 
  36.     <xs:element name="country" type="xs:string" /> 
  37.     <xs:element name="title" type="xs:string" /> 
  38.     <xs:element name="note" type="xs:string" /> 
  39.     <xs:element name="quantity" type="xs:positiveInteger" /> 
  40.     <xs:element name="price" type="xs:decimal" /> 
  41.  
  42.     <!-- 属性的定义 --> 
  43.     <xs:attribute name="orderid" type="xs:string" /> 
  44.  
  45.     <!-- 复合元素的定义 --> 
  46.     <xs:element name="shipto"> 
  47.         <xs:complexType> 
  48.             <xs:sequence> 
  49.                 <xs:element ref="name" /> 
  50.                 <xs:element ref="address" /> 
  51.                 <xs:element ref="city" /> 
  52.                 <xs:element ref="country" /> 
  53.             </xs:sequence> 
  54.         </xs:complexType> 
  55.     </xs:element> 
  56.     <xs:element name="item"> 
  57.         <xs:complexType> 
  58.             <xs:sequence> 
  59.                 <xs:element ref="title" /> 
  60.                 <xs:element ref="note" minOccurs="0" /> 
  61.                 <xs:element ref="quantity" /> 
  62.                 <xs:element ref="price" /> 
  63.             </xs:sequence> 
  64.         </xs:complexType> 
  65.     </xs:element> 
  66.  
  67.     <xs:element name="shiporder"> 
  68.         <xs:complexType> 
  69.             <xs:sequence> 
  70.                 <xs:element ref="orderperson" /> 
  71.                 <xs:element ref="shipto" /> 
  72.                 <xs:element ref="item" maxOccurs="unbounded" /> 
  73.             </xs:sequence> 
  74.             <xs:attribute ref="orderid" use="required" /> 
  75.         </xs:complexType> 
  76.     </xs:element> 
  77.  
  78. </xs:schema> 
			<!-- shiporder.xml文档的内容:-->
			<?xml version="1.0" encoding="UTF-8"?>
			<shiporder orderid="889923"
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xsi:noNamespaceSchemaLocation="shiporder.xsd">
			 <orderperson>George Bush</orderperson>
			 <shipto>
			  <name>John Adams</name>
			  <address>Oxford Street</address>
			  <city>London</city>
			  <country>UK</country>
			 </shipto>
			 <item>
			  <title>Empire Burlesque</title>
			  <note>Special Edition</note>
			  <quantity>1</quantity>
			  <price>10.90</price>
			 </item>
			 <item>
			  <title>Hide your heart</title>
			  <quantity>1</quantity>
			  <price>9.90</price>
			 </item>
			</shiporder>
			
			<!--schema文件内容:-->
			
			<?xml version="1.0" encoding="UTF-8"?>
			<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
			
				<!-- 简易元素的定义 -->
				<xs:element name="orderperson" type="xs:string" />
				<xs:element name="name" type="xs:string" />
				<xs:element name="address" type="xs:string" />
				<xs:element name="city" type="xs:string" />
				<xs:element name="country" type="xs:string" />
				<xs:element name="title" type="xs:string" />
				<xs:element name="note" type="xs:string" />
				<xs:element name="quantity" type="xs:positiveInteger" />
				<xs:element name="price" type="xs:decimal" />
			
				<!-- 属性的定义 -->
				<xs:attribute name="orderid" type="xs:string" />
			
				<!-- 复合元素的定义 -->
				<xs:element name="shipto">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="name" />
							<xs:element ref="address" />
							<xs:element ref="city" />
							<xs:element ref="country" />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="item">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="title" />
							<xs:element ref="note" minOccurs="0" />
							<xs:element ref="quantity" />
							<xs:element ref="price" />
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			
				<xs:element name="shiporder">
					<xs:complexType>
						<xs:sequence>
							<xs:element ref="orderperson" />
							<xs:element ref="shipto" />
							<xs:element ref="item" maxOccurs="unbounded" />
						</xs:sequence>
						<xs:attribute ref="orderid" use="required" />
					</xs:complexType>
				</xs:element>
			
			</xs:schema>

     
三、XML解析技术概述
1.XML解析方式
  dom:(Document Object Model,即文档对象模型)是W3C组织推荐的方式,但它是把整个文档对象放入内存,如果文档太大会导致溢出.
  sax:(Simple API for XML)不是官方标准,但它是xml社区事实上的标准,几乎所有的xml解析器都支持它,是事件驱动型,解决了可能的溢出问题,但只支持I操作.
2.XML解析器
  Crimson(sun)、Xerces(IBM)、Aelfred2(dom4j)
4.XML解析开发包
  Jaxp(sun)、Jdom、dom4j、pull(android的sdk自带)
  其中jaxp指(Java API for XML processing)
四、XML解析示例
     ----------------------
  声明:books.xml中的内容为:
  <?xml version="1.0" encoding="UTF-8"?>
  <books>
   <book id="001">
    <title>Java Core</title>
    <price>20</price>
   </book>
   <book id="002">
    <title>中文试一下</title>
    <price>30</price>
   </book>
  </books>
-----------------------
1.dom4j解析
注意:使用dom4j开发,需要下载dom4j相应的jar文件.
  如果其中用到XPath表达式,则需要导入jaxen-1.1-beta-6.jar.
  (1)IO操作
   I: SAXReader reader = new SAXReader();
    Document document = reader.read("file.xml"); 
   O: FileOutputStream fos = new FileOutputStream("file.dom4j.xml");
    XMLWriter writer = new XMLWriter();
    writer.write(document);
    writer.close();
  (2)获取Document的三种方式
   a:读取XML文件,获得document对象,上边的I操作.
   b:解析XML形式的文本,得到document对象.
    String text = "<books><book></book></books>";
    Document document = DocumentHelper.parseText(text);
   c:主动创建document对象.
    Document document = DocumentHelper.createDocument();
    //创建根节点 books(名字随意)
    Element root = document.addElement("books");
  (3)常用API
   * 获得根元素
    Element rootElement = document.getRootElement();
   * 获得所有的子元素
    List list = rootElement.elements();
   * 获得指定的子元素
    Element priceElement = bookElement.element("price");
   * 获得指定属性的元素(用到XPath表达式)
    Node bookNode = document.selectSingleNode("//book[@id='b002']");
   * 设置文本
    priceElement.setText("100");
   * 获得节点的名称
    child.getName();
   * 获得指定名称的属性值
    String id = bookElement.attributeValue("id");
   * 在某节点下添加子节点
    Element ageEle = bookElement.addElement("title");
   * 删除某节点(//childElement是待删除节点,parentElement是其父节点)
    parentElement.remove(childElement);
   * 获得某节点下的某属性
    Attribute attribute = rootElement.attribute("id");
   * 获得属性的文字
    String text = attribute.getText();
2.dom4j代码示例

  1. import java.io.FileOutputStream; 
  2.  
  3. import org.dom4j.Attribute; 
  4. import org.dom4j.Document; 
  5. import org.dom4j.DocumentHelper; 
  6. import org.dom4j.Element; 
  7. import org.dom4j.Node; 
  8. import org.dom4j.io.SAXReader; 
  9. import org.dom4j.io.XMLWriter; 
  10. //演示Dom4j中的CURD(create update read delete) 
  11. public class Demo { 
  12.  
  13.     public static void main(String[] args) throws Exception { 
  14.         //读取指定文件获取Document 
  15.         SAXReader reader = new SAXReader(); 
  16.         Document document = reader.read("books.xml"); 
  17.          
  18.         //create(document); 
  19.         //update(document); 
  20.         //delete(document); 
  21.          
  22.         //将文档写入XML文件 
  23.         FileOutputStream fos = new FileOutputStream("books.dom4j.xml"); 
  24.         XMLWriter writer = new XMLWriter(fos); 
  25.         writer.write(document); 
  26.         writer.close(); 
  27.     } 
  28.     public static void create(Document document) { 
  29.         Element rootElement = document.getRootElement();//获取根节点 
  30.         //添加id属性 
  31.         Element newBook = DocumentHelper.createElement("book");//创建新元素 
  32.         Attribute id = DocumentHelper.createAttribute(newBook, "id", "003"); 
  33.         newBook.add(id); 
  34.         //添加title元素 
  35.         Element newTitle = DocumentHelper.createElement("title"); 
  36.         newTitle.setText("News"); 
  37.         newBook.add(newTitle); 
  38.         //把创建的newBook添加进根节点 
  39.         rootElement.add(newBook); 
  40.     } 
  41.     public static void update(Document document) { 
  42.         //将id为002的book节点中的加个修改为444 
  43.         Node bookNode = document.selectSingleNode("//book[@id='002']");//XPath表达式 
  44.         Element bookElement = (Element)bookNode;//Node中没有适当方法,转换为Element 
  45.         Element priceElement = bookElement.element("price");//获取price元素 
  46.         priceElement.setText("444");//修改 
  47.     } 
  48.     public static void delete(Document document) { 
  49.         //删除id为001的book节点 
  50.         Node bookNode = document.selectSingleNode("//book[@id='001']"); 
  51.         Element parent = bookNode.getParent();//获取要删除元素的父级元素 
  52.         parent.remove(bookNode); 
  53.     } 
  54. } 
		import java.io.FileOutputStream;

		import org.dom4j.Attribute;
		import org.dom4j.Document;
		import org.dom4j.DocumentHelper;
		import org.dom4j.Element;
		import org.dom4j.Node;
		import org.dom4j.io.SAXReader;
		import org.dom4j.io.XMLWriter;
		//演示Dom4j中的CURD(create update read delete)
		public class Demo {
		
			public static void main(String[] args) throws Exception {
				//读取指定文件获取Document
				SAXReader reader = new SAXReader();
				Document document = reader.read("books.xml");
				
				//create(document);
				//update(document);
				//delete(document);
				
				//将文档写入XML文件
				FileOutputStream fos = new FileOutputStream("books.dom4j.xml");
				XMLWriter writer = new XMLWriter(fos);
				writer.write(document);
				writer.close();
			}
			public static void create(Document document) {
				Element rootElement = document.getRootElement();//获取根节点
				//添加id属性
				Element newBook = DocumentHelper.createElement("book");//创建新元素
				Attribute id = DocumentHelper.createAttribute(newBook, "id", "003");
				newBook.add(id);
				//添加title元素
				Element newTitle = DocumentHelper.createElement("title");
				newTitle.setText("News");
				newBook.add(newTitle);
				//把创建的newBook添加进根节点
				rootElement.add(newBook);
			}
			public static void update(Document document) {
				//将id为002的book节点中的加个修改为444
				Node bookNode = document.selectSingleNode("//book[@id='002']");//XPath表达式
				Element bookElement = (Element)bookNode;//Node中没有适当方法,转换为Element
				Element priceElement = bookElement.element("price");//获取price元素
				priceElement.setText("444");//修改
			}
			public static void delete(Document document) {
				//删除id为001的book节点
				Node bookNode = document.selectSingleNode("//book[@id='001']");
				Element parent = bookNode.getParent();//获取要删除元素的父级元素
				parent.remove(bookNode);
			}
		}

3.JAXP-DOM解析XML
  (1)IO操作
   I: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse("file.xml");
   O: TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
    //将document封装到Source
    Source xmlsource = new DOMSource(document);
    //将file.dom.xml路径封装到Result
    Result outputTarget = new StreamResult("file.dom.xml");
    transformer.transform(xmlSource, outputTarget);
  (2)常用API
   * 获取指定标签的所有元素
    NodeList bookElements = document.getElementsByTagName("book");
   * 获得上边NodeList的长度
    bookElements.getLength();
   * 获得指定索引的节点对象
    bookElements.item(index);
   * 获得当前元素的所有子节点
    NodeList childList = element.getChildNodes();//element为当前元素名称
   * 通过元素获得当前元素指定的属性
    element.getAttribute("id");//element为当前元素名称
   * 获得当前节点的名称
    node.getNodeName();//node为当前节点名称
   * 获得当前节点的子节点的所有文本
    node.getTextContent();
    例如:<book><title>Java</title></book> 获取book节点的子节点的所有文本
    结果:"<title>Java</title>"
   * 返回这个节点的第一个子节点
    getFirstChild();
   * 返回这个节点的父节点对象
    getParentNode();
   * 为这个节点添加一个子节点,并放在所有字节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去.
    appendChild();
   * 删除给定的子节点对象
    removeChild();
  (3)DOM代码示例

  1. import javax.xml.parsers.DocumentBuilder; 
  2. import javax.xml.parsers.DocumentBuilderFactory; 
  3. import javax.xml.transform.Result; 
  4. import javax.xml.transform.Source; 
  5. import javax.xml.transform.Transformer; 
  6. import javax.xml.transform.TransformerFactory; 
  7. import javax.xml.transform.dom.DOMSource; 
  8. import javax.xml.transform.stream.StreamResult; 
  9. import org.w3c.dom.Document; 
  10. import org.w3c.dom.Element; 
  11. import org.w3c.dom.NodeList; 
  12.  
  13. public class Demo2 { 
  14.  
  15.     public static void main(String[] args) throws Exception { 
  16.         //获取document 
  17.         DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance(); 
  18.         DocumentBuilder builder = factory1.newDocumentBuilder(); 
  19.         Document document = builder.parse("books.xml"); 
  20.          
  21.         //delete(document); 
  22.         //create(document); 
  23.          
  24.         //保存 
  25.         TransformerFactory factory2 = TransformerFactory.newInstance(); 
  26.         Transformer transformer = factory2.newTransformer(); 
  27.         Source xmlSource = new DOMSource(document); 
  28.         Result outputTarget = new StreamResult("books.jaxp.xml"); 
  29.         transformer.transform(xmlSource, outputTarget); 
  30.     } 
  31.     public static void create(Document document) { 
  32.         //新建元素 
  33.         Element newBook = document.createElement("book"); 
  34.         Element newTitle = document.createElement("title"); 
  35.         Element newPrice = document.createElement("price"); 
  36.         //设置元素内容或属性 
  37.         newTitle.setTextContent("Thinking in Java!"); 
  38.         newPrice.setTextContent("99"); 
  39.         newBook.setAttribute("id", "004"); 
  40.         //关联 
  41.         newBook.appendChild(newTitle); 
  42.         newBook.appendChild(newPrice); 
  43.         document.getDocumentElement().appendChild(newBook); 
  44.          
  45.     } 
  46.     public static void delete(Document document) { 
  47.         NodeList list = document.getElementsByTagName("book"); 
  48.         for(int i = 0; i < list.getLength(); i++) { 
  49.             //获取每一本书 
  50.             Element element = (Element)list.item(i); 
  51.             if("001".equals(element.getAttribute("id"))){ 
  52.                 //获取根节点,即book元素的父节点,用来删除book 
  53.                 Element rootElement = document.getDocumentElement(); 
  54.                 rootElement.removeChild(element); 
  55.             } 
  56.         } 
  57.     } 
  58. } 
			import javax.xml.parsers.DocumentBuilder;
			import javax.xml.parsers.DocumentBuilderFactory;
			import javax.xml.transform.Result;
			import javax.xml.transform.Source;
			import javax.xml.transform.Transformer;
			import javax.xml.transform.TransformerFactory;
			import javax.xml.transform.dom.DOMSource;
			import javax.xml.transform.stream.StreamResult;
			import org.w3c.dom.Document;
			import org.w3c.dom.Element;
			import org.w3c.dom.NodeList;
			
			public class Demo2 {
			
				public static void main(String[] args) throws Exception {
					//获取document
					DocumentBuilderFactory factory1 = DocumentBuilderFactory.newInstance();
					DocumentBuilder builder = factory1.newDocumentBuilder();
					Document document = builder.parse("books.xml");
					
					//delete(document);
					//create(document);
					
					//保存
					TransformerFactory factory2 = TransformerFactory.newInstance();
					Transformer transformer = factory2.newTransformer();
					Source xmlSource = new DOMSource(document);
					Result outputTarget = new StreamResult("books.jaxp.xml");
					transformer.transform(xmlSource, outputTarget);
				}
				public static void create(Document document) {
					//新建元素
					Element newBook = document.createElement("book");
					Element newTitle = document.createElement("title");
					Element newPrice = document.createElement("price");
					//设置元素内容或属性
					newTitle.setTextContent("Thinking in Java!");
					newPrice.setTextContent("99");
					newBook.setAttribute("id", "004");
					//关联
					newBook.appendChild(newTitle);
					newBook.appendChild(newPrice);
					document.getDocumentElement().appendChild(newBook);
					
				}
				public static void delete(Document document) {
					NodeList list = document.getElementsByTagName("book");
					for(int i = 0; i < list.getLength(); i++) {
						//获取每一本书
						Element element = (Element)list.item(i);
						if("001".equals(element.getAttribute("id"))){
							//获取根节点,即book元素的父节点,用来删除book
							Element rootElement = document.getDocumentElement();
							rootElement.removeChild(element);
						}
					}
				}
			}

4.JAXP-SAX解析XML
  (1)SAX解析概述
   SAX是事件驱动的XML处理方法,它逐行扫描文档,一边扫描一边解析.
   在I操作时会用到DefaultHandler类,需要定义自定义类继承此类,并实现需要的方法.
   DefaultHandler默认的是空实现.
  (2)SAX解析需要用到的方法
   * startDocument: 文档开始
   * startElement: 元素开始
    uri: 名称空间URI,如果元素没有则为空字符串.
    localName: 本地名称,如果没有名称空间,则为空字符串.
    qName: 限定的名称.
    attributes: 附加到元素的属性.
   * characters: 文本
    通过new String(ch, start, length)获得字符串.
   * endElement: 元素结束
   * endDocument: 文档结束
   还有很多方法,可以查看API文档,如果需要可以在自定义类中覆盖未实现的方法.
  
  (3)SAX解析的I操作代码示例

  1. import javax.xml.parsers.SAXParser; 
  2. import javax.xml.parsers.SAXParserFactory; 
  3. import org.xml.sax.helpers.DefaultHandler; 
  4.  
  5. public class Demo3 { 
  6.     public static void main(String[] args) throws Exception { 
  7.         SAXParserFactory factory = SAXParserFactory.newInstance(); 
  8.         SAXParser parser = factory.newSAXParser(); 
  9.         //这里需要编写自定义处理事件  
  10.         DefaultHandler dh = new MyDefaultHandler(); 
  11.         parser.parse("books.xml", dh); 
  12.     } 
  13. } 
  14. ------------------------- 
  15. //自定义类 
  16. import org.xml.sax.Attributes; 
  17. import org.xml.sax.SAXException; 
  18. import org.xml.sax.helpers.DefaultHandler; 
  19.  
  20. public class MyDefaultHandler extends DefaultHandler{ 
  21.      
  22.     @Override 
  23.     public void startDocument() throws SAXException { 
  24.         System.out.println("文档开始"); 
  25.     } 
  26.     @Override 
  27.     /**
  28.      * 如果xml文件使用了schema约束 <xs:element>
  29.      *   * uri:schema -- targetNameSpace  
  30.      *   * localName--element
  31.      *   * qName---xs:element
  32.      * 如果不使用
  33.      *   * uri:null
  34.      *   * localName:null
  35.      *   * qName : element
  36.      * Attributes:当前元素的所有的属性的集合
  37.      */ 
  38.     public void startElement(String uri, String localName, String qName, 
  39.             Attributes attributes) throws SAXException { 
  40.         System.out.println("元素开始" + qName + " *** " + attributes.getValue("id")); 
  41.     } 
  42.     @Override 
  43.     public void characters(char[] ch, int start, int length) 
  44.             throws SAXException { 
  45.         System.out.println(new String(ch ,start, length)); 
  46.     } 
  47.     @Override 
  48.     public void endElement(String uri, String localName, String qName) 
  49.             throws SAXException { 
  50.         System.out.println("元素结束:" + qName); 
  51.     } 
  52.     @Override 
  53.     public void endDocument() throws SAXException { 
  54.         System.out.println("文档结束"); 
  55.     } 
  56. } 
			import javax.xml.parsers.SAXParser;
			import javax.xml.parsers.SAXParserFactory;
			import org.xml.sax.helpers.DefaultHandler;
			
			public class Demo3 {
				public static void main(String[] args) throws Exception {
					SAXParserFactory factory = SAXParserFactory.newInstance();
					SAXParser parser = factory.newSAXParser();
					//这里需要编写自定义处理事件 
					DefaultHandler dh = new MyDefaultHandler();
					parser.parse("books.xml", dh);
				}
			}
			-------------------------
			//自定义类
			import org.xml.sax.Attributes;
			import org.xml.sax.SAXException;
			import org.xml.sax.helpers.DefaultHandler;
			
			public class MyDefaultHandler extends DefaultHandler{
				
				@Override
				public void startDocument() throws SAXException {
					System.out.println("文档开始");
				}
				@Override
				/**
				 * 如果xml文件使用了schema约束 <xs:element>
				 * 	 * uri:schema -- targetNameSpace   
				 *   * localName--element
				 *   * qName---xs:element
				 * 如果不使用
				 *   * uri:null
				 *   * localName:null
				 *   * qName : element
				 * Attributes:当前元素的所有的属性的集合
				 */
				public void startElement(String uri, String localName, String qName,
						Attributes attributes) throws SAXException {
					System.out.println("元素开始" + qName + " *** " + attributes.getValue("id"));
				}
				@Override
				public void characters(char[] ch, int start, int length)
						throws SAXException {
					System.out.println(new String(ch ,start, length));
				}
				@Override
				public void endElement(String uri, String localName, String qName)
						throws SAXException {
					System.out.println("元素结束:" + qName);
				}
				@Override
				public void endDocument() throws SAXException {
					System.out.println("文档结束");
				}
			}

 

原文地址:http://blog.youkuaiyun.com/wyply115/article/details/7990210


实验2XML文档及其DTD XML网页设计使用教程 实验2XML文档及其DTD 一、实验目的 (1)理解XML和DTD文档之间的关系及使用DTD的重要性 (2)熟练掌握DTD中的元素、属性、实体和注记的声明方法 立即下载

相关推荐

XML编程与应用教程课后习题答案

XML编程与应用教程课后习题答案

XML介绍之DTD约束语法详解五

7.DTD - 来自网络的实例 =========================================== 电视节目表 DTD 由 David Moisan 创造。拷贝自:http://www.davidmoisan.org/ ]>报纸文章 DTD 拷贝自:http://www.vervet.

lijizh1013的专栏 2176

基于角谱传播的MATLAB仿真:从相位恢复看自由空间光传播

本文详细介绍了基于角谱传播理论的MATLAB仿真方法,用于模拟自由空间光传播过程。通过傅里叶光学原理,将光场分解为频谱并应用传播相位滤波器,实现了从纯相位物体到可观测衍射图样的仿真。文章结合具体代码,演示了如何利用角谱法进行相位恢复,为计算成像和生物医学检测等领域的研究提供了实用的仿真工具和思路。

weixin_29055699的博客 282

【xml】DTD文档和内部DTD 实验三

外部DTD文档 不需要在外面再套一层 <!DOCTYPE NEWSPAPER[ ]> 这个了。直接这样写 <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE, BYLINE, LEAD, BODY, ...

韩旭051的博客 1543

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 602

YOLO-FastestV2从零部署到移动端推理实战手册

本文详细介绍了YOLO-FastestV2从零开始的完整部署流程,涵盖环境搭建、模型训练、格式转换及移动端部署。通过实战步骤,指导开发者将这一轻量级目标检测模型成功部署到Android设备,实现实时推理。文章重点解析了PyTorch到NCNN的模型转换与优化,助力移动端AI应用开发。

l1k9j8h7g6的博客 668

xml-02-DTD约束

1.DTD简介 引用W3C的一段介绍:文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。这句话说白了就是用来规范xml的。xml是可扩展的标记语言,元素和属性都可以任意定义,没有任何的约束。这样在给了coder权利的同时也更容易犯错误。同时也造成了数据传输的不规范性。那么为了保证对

flaydog的博客 386

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 489

XML文档搜索使用小结

XML文档搜索使用小结www.itonline.gd.cn  2003-11-19   大家在.NET中处理XML文档的时候,经常会需要找到文档中的某个节点的数据。要找到某个节点,有许多种方法,在这里我就把几种常用的方法给大家总结一下。      首先,我们要做的是要把一个XML文档装入到一个XmlDocument对象中去。      先引用几个名字空间:      using S

880

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

微信公众号 - 最新详细实现H5网页接入微信支付功能,开发移动端、PC端网站集成使用微信支付流程及示例代码,公众号网页利用JS-SDK/JSAPI/H5支付授权唤起微信支付,可脱离微信环境支付或内置浏

微信公众号,微信支付,网页,移动端,h5,扫码支付,二维码付款,手机网页,电脑pc网页生成支付二维码,js-sdk,jsapi,外部浏览器调起微信支付,脱离微信环境,在微信内置浏览器如何进行微信支付,前端H5微信支付,web网站,vue2,vue3,nuxt2,nuxt3,jquery,微信公众号h5支付流程,如何实现,怎么做,回调报错,redirect_uri参数错误,必须部署才能调试吗,怎么不打包发布就能在本机测试,微信H5支付能力,uniapp微信支付,h5页面调起支付,支付没反应,无效,失败,H5页

🏆 前端领域优质创作者 6103

XML学习小结

XML是可扩展标记语言(Extensible Markup Language)的缩写,它是是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。 例如,一个描述书籍的XML文档可能如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE note SYSTEM "book.dtd"> <book id="1"> <name>Java编程的逻辑</name> <a

追求大牛之人的博客 4426

钉钉多维表格开发

从0到1完成钉钉多维表格开发SDK对接与实践案例。

沉修所长,勇逐新机;安而不怠,静而思变 3621

处理XML文件的小结

处理XML文件的小结1.  取节点的值1) 同一层次的a. 循环遍历          private string processXpathQuery(XPathNavigator xpnav, String xPathQuery)         {              string strReturn="" ;              xpnav.Move

Megres的专栏 1372

学Simulink--基于高比例可再生能源渗透的复杂电网建模场景实例:新能源高渗透下传统同步机主导系统的动态响应建模

摘要:本文详细介绍使用MATLAB/Simulink构建高比例可再生能源渗透的电网系统模型。主要内容包括:系统结构设计(新能源发电、同步发电机、电网等模块)、详细建模步骤(从创建项目到集成各模块)、关键控制算法实现(如MPPT和调速器控制)以及仿真分析。通过该模型可研究新能源高渗透率下传统同步机系统的动态响应特性,为电力系统稳定性分析提供有效工具。文章包含示例代码和典型仿真结果,展示了频率、电压等关键参数的稳定性表现。

xiaoheshang_123的博客 86

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

XML小结

这段时间进行了对XML的学习,刚刚开始的时候,我们都知道HTML的学习,慢慢接触了xml之后觉得他们就好像是在asp.net中的自带控件和用户自定义控件,以前我们在进行一些网页的制作的时候我们也接触过关于xml的一些相应的知识,那么我们来全局的进入xml的世界里面吧!     1.xml定义        可扩展标记语言是一种元标记语言,即定义了用于定义其他特定领域有关语义的、结构化的标记语言

郭蕾蕾 努力的包子 1149

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

xml初学小结

XML语言出现的根本目标在于描述上图那种,在现实生活中经常出现的有关系的数据。 在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。例如: 海淀区   东金庄 桥西区 ML技术除用于保存有关系的数据

alibinghua的专栏 463

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

XML知识小结

1.xml:可扩展标记语言 2.xml和html区别? (1)html所有标签都是预定义的,xml所有标签都是自定义的 (2)html语法松散,xml语法严格,区分大小写 (3)html做页面展示,xml描述数据 3.xml作用 (1)作为配置文件 (2)用来传输和存储数据 4.xml语...

140

【XML】学习小结

一、基础: 1、XML是一种标记语言。 (标记语言:通过用文字做标记,来表达一些效果或者携带一些数据) 2、HTML &amp; XML: HTML  . HTML(HyperText Markup Language)  . HTML 是互联网应用的最基础技术  . HTML 关注的是数据的显示  .  HTML的核心作用是信息的布局和显示  XML  . XML ( eXtensib...

心似烟火 263

java读取解析XML小结

java读取XML文件小结java读取XML文件java修改XML文件 java读取XML文件 最近开发碰到对XML文件进行解析,查找了很多资料,总结一个自己喜欢用的一种模式,java代码如下: SAXReader reader = new SAXReader(); String rootPath = System.getProperty("user.dir").replace("\\", "/"); //File file = new File(rootPath+"/

xian_hui的博客 342

XML知识小结1

首先要了解下XML是什么作用,它可以描述数据、传输数据,而且XML文件写法上有着固定的写法,在每个XML文件开头第一句都是,而且前面不允许有空格或者换行或者注释,其中还可以添加属性encoding,不写的话默认为UTF-8。每个XML文件必须有开始和结束标签,而且只能有一个根标签,其中的标签必须合理嵌套。XML不会忽略标签中的空格和回车换行。元素(标签)的名称可以包含字母、数字、减号、下划线和英文

cds885的专栏 349
上一篇: Struts2_ValueStack,OGNL详解
下一篇: struts2小结
疯疯爱吃辣
博客等级 码龄15年 25粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值