使用jaxp进行dom解析_动力节点Java学院整理

发布时间 - 2026-01-11 02:36:34    点击率:

1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回

2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

3.调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

4.调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

案例1.遍历xml文件中跟节点下面的所有子节点.

1.xml的约束文件Java.dtd

<!ELEMENT classes (java班,net班,php班,ios班)> 
<!ELEMENT java班 (teachers?,students?)> 
<!ELEMENT net班 (teachers?,students?)> 
<!ELEMENT php班 (teachers?,students?)> 
<!ELEMENT ios班 (teachers?,students?)> 
<!ELEMENT teachers (teacher*)> 
<!ELEMENT teacher EMPTY> 
<!ELEMENT students (student*)> 
<!ELEMENT student (name,sex,age)> 
<!ATTLIST java班 name CDATA #IMPLIED> 
<!ATTLIST net班 name CDATA #IMPLIED> 
<!ATTLIST php班 name CDATA #IMPLIED> 
<!ATTLIST ios班 name CDATA #IMPLIED> 
<!ATTLIST teacher name CDATA #IMPLIED> 
<!ATTLIST teacher sex CDATA #IMPLIED> 
<!ATTLIST teacher age CDATA #IMPLIED> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT sex (#PCDATA)> 
<!ELEMENT age (#PCDATA)> 
<!ATTLIST student id ID #IMPLIED> 

2.xml文件内容如下java.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE classes SYSTEM "bin//parsers//java.dtd"> 
<classes> 
  <java班 name="CSDNJava01班"> 
    <teachers> 
      <teacher name="军哥" sex="男" age="28" /> 
      <teacher name="刘丽华" sex="女" age="28" /> 
    </teachers> 
    <students> 
      <student id="x121"> 
        <name>王亮</name> 
        <sex>女</sex> 
        <age>28</age> 
      </student> 
    </students> 
  </java班> 
  <!-- 注释0 --> 
  <net班 name="CSDNNet01班">xxx</net班> 
  <php班 name="CSDNPhp01班"></php班> 
  <ios班 name="CSDNIos01班"></ios班> 
</classes> 
<!-- 对java.xml文件进行CRUD的操作 --> 
<!-- 节点 
    nodeName      nodeValue    nodeType 
element 标签名        null       1 
Attr   属性名       属性值      2 
text   #text        文本的值     3 
 --> 

3.遍历xml文件的操作

//1.获取XML的根节点对象
@Test 
  public void test() throws ParserConfigurationException, SAXException, IOException{ 
    //调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂 
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    //调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象 
    DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
    //通过文件的方式获取Document对象 
    /*File file = new File("src//parsers//java.xml"); 
    System.out.println(file+"----"); 
    Document document = builder.parse(file);*/ 
    //解析指定的文件 
    InputStream is= this.getClass().getClassLoader() 
               .getResourceAsStream("parsers//java.xml"); 
    Document document = builder.parse(is); 
     
    //document.getDocumentElement()获取根节点的元素对象 
    Element root = document.getDocumentElement(); 
    //遍历根节点下面的所有子节点 
    listNodes(root); 
  } 

2.遍历节点对象的方法

/** 
   * 遍历根据节点对象下面的所有的节点对象 
   * @param node 
   */ 
  public void listNodes(Node node) { 
    // 节点是什么类型的节点 
    if (node.getNodeType() == Node.ELEMENT_NODE) {// 判断是否是元素节点 
      Element element = (Element) node; 
      //判断此元素节点是否有属性 
      if(element.hasAttributes()){ 
        //获取属性节点的集合 
        NamedNodeMap namenm =  element.getAttributes();//Node 
        //遍历属性节点的集合 
        for(int k=0;k<namenm.getLength();k++){ 
          //获取具体的某个属性节点 
          Attr attr = (Attr) namenm.item(k); 
          System.out.println("name:::"+attr.getNodeName()+" value::" 
                   +attr.getNodeValue()+" type::"+attr.getNodeType()); 
        } 
      } 
      //获取元素节点的所有孩子节点 
      NodeList listnode = element.getChildNodes(); 
      //遍历 
      for (int j = 0; j < listnode.getLength(); j++) { 
        //得到某个具体的节点对象 
        Node nd = listnode.item(j); 
        System.out.println("name::" + nd.getNodeName() + " value:::" 
            + nd.getNodeValue() + " type:::" + nd.getNodeType()); 
        //重新调用遍历节点的操作的方法 
        listNodes(nd); 
      } 
 
    } 
  } 

4.查询某个节点对象(简单列举一些案例)

/** 
 * 根据标签的名称查找所有该名称的节点对象 
 */ 
public void findNode(Document document) { 
  //根据标签名称获取该名称的所有节点对象 
  NodeList nodelist = document.getElementsByTagName("teacher"); 
  //遍历 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //得到具体的某个节点对象 
    Node node = nodelist.item(i); 
    System.out.println(node.getNodeName()); 
  } 
} 
 
/** 
 * 根据属性的值 查询某个节点对象 
 * 属性值是唯一(假设) 
 * @param document 
 * @param value 
 * @return 
 */ 
public Node findNodeByAttrValue(Document document, String value) { 
  //根据标签名称获取该名称的节点对象集合 
  NodeList nodelist = document.getElementsByTagName("teacher"); 
  //遍历 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //获取某个具体的元素节点对象 
    Element node = (Element) nodelist.item(i); 
    //根据属性名称获取该节点的属性节点对象 
    Attr attr = node.getAttributeNode("name"); 
    //获取属性节点的值是否给指定的节点属性值相同 
    if (attr.getNodeValue().equals(value)) { 
      //返回此节点 
      return node; 
    } 
  } 
  return null; 
} 
 
/** 
 * 根据id获取某个节点对象 
 * 
 * @param document 
 * @param id 
 * @return 
 */ 
public Node findNodeById(Document document, String id) { 
  return document.getElementById(id); 
} 

5.删除指定的节点对象

/** 
   * 删除某个节点对象 
   * 
   * @param document 
   * @param id 
   * @throws TransformerException 
   */ 
  public void deleteNodeById(Document document, String id) 
      throws TransformerException { 
    //获取删除的节点对象 
    Node node = document.getElementById(id); 
    // 是通过父节点调用removeChild(node)把子节点给删除掉 
    Node node1 = node.getParentNode().removeChild(node); 
     
    //创建TransformerFactory对象 
    TransformerFactory transformerFactory = TransformerFactory 
        .newInstance(); 
    //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出 
    //Transformer对象通过TransformerFactory获得 
    Transformer transformer = transformerFactory.newTransformer(); 
    // 把Document对象又重新写入到一个XML文件中。 
    transformer.transform(new DOMSource(document), new StreamResult( 
        new File("src//a.xml"))); 
  } 

6.更新某个节点对象

/** 
 * 更新某个节点 
 * 
 * @param document 
 * @param id 
 * @throws TransformerException 
 */ 
public void updateNodeById(Document document, String id) 
    throws TransformerException { 
  //根据id获取元素指定的元素节点对象 
  Element node = document.getElementById(id); 
  //获取元素节点的id属性节点对象 
  Attr attr = node.getAttributeNode("id"); 
  //修改元素节点的属性值 
  attr.setValue("x122"); 
 
  //获取该节点对象的所有孩子节点对象name、age、sex节点 
  NodeList nodelist = node.getChildNodes(); 
    //遍历 
  for (int i = 0; i < nodelist.getLength(); i++) { 
    //得到具体的节点对象 
    Node n = nodelist.item(i); 
    //判断是否是元素节点对象 
    if (n.getNodeType() == Node.ELEMENT_NODE) { 
      //看是否是name节点 
      if (n.getNodeName().equals("name")) { 
        n.setTextContent("君君");//修改其值 
      } else if (n.getNodeName().equals("age")) {//看看是否是age节点 
        n.setTextContent("80");//修改其值 
      } else if (n.getNodeName().equals("sex")) {//看看是否是sex节点 
        n.setTextContent("男");//修改其值 
      } else { 
        System.out.println("不做处理"); 
      } 
    } 
  } 
 
  //创建TransformerFactory对象 
  TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
  //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出 
  //Transformer对象通过TransformerFactory获得 
  Transformer transformer = transformerFactory.newTransformer(); 
  //把Document对象又重新写入到一个XML文件中。 
  transformer.transform(new DOMSource(document), new StreamResult( 
      new File("src//b.xml"))); 
} 

7.在某个节点的下方添加新的节点

/** 
 * 在指定的节点下方添加新得某个节点 
 * 
 * @param document 
 * @param id 
 * @throws TransformerException 
 */ 
public void addNodeById(Document document, String id) 
    throws TransformerException { 
  //获取要添加位置节点的兄弟节点对象 
  Element node = document.getElementById(id); 
  //获取其父节点对象 
  Node parentNode = node.getParentNode(); 
  //创建元素节点 
  Element nd = document.createElement("student"); 
  //设置元素节点的属性值 
  nd.setAttribute("id", "x123"); 
  //创建name元素节点 
  Node name = document.createElement("name"); 
  //设置name节点的文本值 
  name.appendChild(document.createTextNode("陈红军")); 
  //创建age元素节点 
  Node age = document.createElement("age"); 
  //设置age节点的文本值 
  age.appendChild(document.createTextNode("20")); 
  //创建sex元素节点 
  Node sex = document.createElement("sex"); 
  //设置sex节点的文本值 
  sex.appendChild(document.createTextNode("男")); 
  //在nd节点中添加3个子节点 
  nd.appendChild(name); 
  nd.appendChild(age); 
  nd.appendChild(sex); 
  //在父节点中添加nd节点 
  parentNode.appendChild(nd); 
  //创建TransformerFactory对象 
  TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
  //Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出 
  //Transformer对象通过TransformerFactory获得 
  Transformer transformer = transformerFactory.newTransformer(); 
  //把Document对象又重新写入到一个XML文件中。 
  transformer.transform(new DOMSource(document), new StreamResult( 
      new File("src//c.xml"))); 
} 

通过以上方法的练习希望你对xml的DOM解析有个入门的了解.

总结

以上所述是小编给大家介绍的使用jaxp进行dom解析_,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# jaxp  # dom解析  # Java中JDom解析XML_动力节点Java学院整理  # Dom4j解析XML_动力节点Java学院整理  # java使用xpath和dom4j解析xml  # java dom4j解析xml文件代码实例分享  # 在java中使用dom4j解析xml(示例代码)  # 遍历  # 转换为  # 文档  # 行输出  # 小编  # 判断是否  # 是一个  # 有个  # 在此  # 作了  # 给大家  # 你对  # 不做  # 可以利用  # 所述  # 创建一个  # 给我留言  # 感谢大家  # 其父  # 包中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 使用Dockerfile构建java web环境  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何将凡科建站内容保存为本地文件?  教你用AI将一段旋律扩展成一首完整的曲子  再谈Python中的字符串与字符编码(推荐)  Laravel怎么实现模型属性的自动加密  图册素材网站设计制作软件,图册的导出方式有几种?  移动端脚本框架Hammer.js  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel怎么为数据库表字段添加索引以优化查询  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何用低价快速搭建高质量网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  php485函数参数是什么意思_php485各参数详细说明【介绍】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  微信小程序 wx.uploadFile无法上传解决办法  如何快速使用云服务器搭建个人网站?  香港网站服务器数量如何影响SEO优化效果?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  b2c电商网站制作流程,b2c水平综合的电商平台?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何快速搭建高效服务器建站系统?  千库网官网入口推荐 千库网设计创意平台入口  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  免费网站制作appp,免费制作app哪个平台好?  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何快速搭建高效可靠的建站解决方案?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何在橙子建站上传落地页?操作指南详解  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何在万网ECS上快速搭建专属网站?  Python图片处理进阶教程_Pillow滤镜与图像增强  html5如何实现懒加载图片_ intersectionobserver api用法【教程】