Java对XML解析(笔记)

XML文件

<?xml version="1.0" encoding="utf-8"?>
<!--使用内部DTD文件-->
<!DOCTYPE pets [
  <!ELEMENT pets (dogs,penguins)>
  <!ELEMENT dogs (dog*)>
  <!ELEMENT penguins (penguin+)>
  <!ELEMENT dog (name,health,love,strain?)>
  <!ATTLIST dog id CDATA #REQUIRED>
  <!ELEMENT penguin (name,health,love,sex)>
  <!ATTLIST penguin id CDATA #REQUIRED>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT health (#PCDATA)> 
  <!ELEMENT love (#PCDATA)> 
  <!ELEMENT starain (#PCDATA)>
  <!ELEMENT sex (#PCDATA)>
]>
<pets>
  <dogs>
    <dog id = "1">
      <name>YAYA</name>
      <health>100</health>
      <love>99</love>
      <strain>雪瑞</strain>
    </dog>
    <dog id = "2">
      <name>OUOU</name>
      <health>100</health>
      <love>80</love>
      <strain>拉布拉多</strain>
    </dog>
  </dogs>
  <penguins>
    <penguin id = "3">
      <name>QQ</name>
      <health>90</health>
      <love>80</love>
      <strain>Q仔</strain>
    </penguin>
  </penguins>
</pets>


DTD学习笔记

  一个XML文档均以一下简单模块构成:元素、属性、实体、PCDATA(被解析的字符数据)、CDATA(字符数据)

  <!DOCTYPE 文本根节点名称 [包含类别]>

  声明一个元素:<!ELEMENT 元素名称 类别>或<!ELEMENT 元素名称 (元素内容)>

  申明一个空元素:<!ELEMENT 元素名称 EMPTY>  如:<!ELEMENT br EMPTY>

  带有子元素(序列)的元素:<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

 

  声明只出现一次的元素:<!ELEMENT 元素名称 (子元素名称)>

  声明最少出现一次的元素:<!ELEMENT 元素名称 (子元素名称+)>

  声明出现零次或多次的元素:<!ELEMENT 元素名称 (子元素名称*)>

  声明出现零次或一次的元素:<!ELEMENT 元素名称 (子元素名称?)>

  声明“非.../即...”类型的内容:<!ELEMENT note (to,from,header,(message|body))>


  声明属性:

  <!ATTLIST 元素名称 属性名称 属性类型 默认值>  如:<!ATTLIST payment type CDATA "check">

  属性类型:CDAT(值为字符数据),(e1|e2|...)(此值是枚举列表),ID(值为唯一的id),IDREF(值为另一个元素的id),IDREFS(值为其他id列表)

        NMTOKEN(值为合法XML名称),NMTOKENS(值为合法XML名称列表),ENTITY(为实体),ENTITIES(实体列表)NOATIOM(此值是符号的名称),

        xml:(值是一个预定义的xml值)

  默认值:值(默认值),#REQUIRED(值时必须的), #IMPLIED(值不是必须的), #FIXED value(值是固定的)


  实体声明:<!ENTITY 实体名称 "实体的值">  如:<!ENTITY writer "Bill Gates">

 


//得到Dom解析器的工厂实例
DocumentBuliderFactory dbf = FocumentBuliderFactory.newInstance();
try{
    //从XML工厂获得DOM解析器
    DocumentBulider db = dbf.newDocumentBulider();
    //解析XML文档,得到一个Docment,即Dom树
    Document doc = db.parse("pet.xml");
    //得到所有dog节点列表信息
    NodeList dogList = doc.getElementsByTagName("dog");
    //循环dog信息
    for(int i = 0; i < dogList.getLength(); i++){
        //取得第i条dog的元素信息
        Node dog = dogLisnt.item(i);
        Element elementd = (Element)dog;
        //取出第i  dog的属性id值
        String attrValue = element.getAttribute("id");
        //取得dog标签下的所有标签
        for(Node node = dog.getFirstChild(); node != null; node = node.getNextSibling()){
            //判断该节点是否为 Element节点
            if(node.getNodeType() == Node.ELMENT_NODE){
                //取得第i个节点的节点名称
                String name = node.getNodeName();
                //取得第i个节点的节点下的第一个子节点的值
                String value = node.getFirstChild().getNodeValue();
                System.out.print(name+":"+value+"\t");
            }
        }
    }
 }catch(ParserConfigurationException e){
     e.printStackTrace();
 }catch(FileNotFoundException e){
     e.printStackTrace(); 
}catch(SAXException e){     
    e.printStackTrace();
 }catch(IoException e){
     e.printStackTrace(); 
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种方式来解析XML文件,包括DOM、SAX和StAX等。 1. DOM(Document Object Model)解析:将整个XML文档加载到内存中,形成一棵树形结构,可以通过访问树的节点来获取XML文件中的数据。 2. SAX(Simple API for XML)解析:基于事件驱动的解析方式,逐行读取XML文档,遇到节点开始、结束、属性等事件时触发相应的事件处理器进行处理。 3. StAX(Streaming API for XML)解析:也是基于事件驱动的解析方式,但是与SAX不同的是,它可以在读取节点时进行修改,也可以在遍历时进行跳过,具有更高的灵活性。 下面是一个使用DOM解析XML文件的示例代码: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class XmlParser { public static void main(String argv[]) { try { File fXmlFile = new File("file.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("student"); System.out.println("----------------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Student id : " + eElement.getAttribute("id")); System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent()); System.out.println("Email : " + eElement.getElementsByTagName("email").item(0).getTextContent()); System.out.println("Marks : " + eElement.getElementsByTagName("marks").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 该示例代码读取了一个名为“file.xml”的XML文件,遍历其中的“student”节点,并输出每个节点的“id”属性以及“firstname”、“lastname”、“email”和“marks”子节点的文本内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值