采用org.w3c.dom进行XML操作(一)

本文介绍了一个名为XmlBuilder的Java类,该类能够从指定路径加载XML文件,并生成DOM文档及根节点,便于进一步处理和操作XML内容。
XMLBuilder.java

 用于创建DOM,Root结点

/********************************************************************
 * 项目名称    :rochoc   <p>
 * 包名称      :rochoc.xml.oper <p>
 * 文件名称    :XmlBuilder   <p>
 * 编写者     :luoc    <p>
 * 编写日期    :2005-6-22    <p>
 * 程序功能(类)描述 : 根据传入的XML文件生成Document和root结点<p>
 * 
 * 程序变更日期   :
 * 变更作者    :
 * 变更说明    :
********************************************************************/
package rochoc.xml.oper;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

/**
 * 类名:XmlBuilder  <p>
 * 类描述:根据传入的XML文件生成Document和root结点 <p>
 * 编写者 :luoc<p>
 * 编写日期 :2005-6-22<p>
 * 主要public成员变量:<p>
 * 主要public方法:   <p>
 **/

public class XmlBuilder
{
    /**
     *构造函数说明:       <p>
     *参数说明:@param path   <p>
    **/
    public XmlBuilder(String path)
    {
        this.path=path;
        init();
    }
    
    /**
    * 方法名称:init<p>
    * 方法功能:初始化函数<p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public void init()
    {
        buildDocument();
        buildRoot();
    }
    
    /**
    * 方法名称:buildDocument<p>
    * 方法功能:将XML文件生成Document <p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    private void buildDocument()
    {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        try
        {
            DocumentBuilder builder=factory.newDocumentBuilder();
            logger.debug("Construct document builder success.");
            doc=builder.parse(new File(path));            
            logger.debug("Build xml document success.");
        }catch(ParserConfigurationException e)
        {
            logger.error("Construct document builder error:"+e);
        }catch(SAXException e)
        {
            logger.error("Parse xml file error:"+e);
        }catch(IOException e)
        {
            logger.error("Read xml file error:"+e);
        }
    }
    
    /**
    * 方法名称:buildRoot<p>
    * 方法功能:生成XML的根结点<p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    private void buildRoot()
    {
        root=doc.getDocumentElement();
    }
    
    /**
     * @return 返回 doc。
     */
    public Document getDoc()
    {
        return doc;
    }
    /**
     * @param doc 要设置的 doc。
     */
    public void setDoc(Document doc)
    {
        this.doc = doc;
    }
    /**
     * @return 返回 path。
     */
    public String getPath()
    {
        return path;
    }
    /**
     * @param path 要设置的 path。
     */
    public void setPath(String path)
    {
        this.path = path;
    }
    /**
     * @return 返回 root。
     */
    public Element getRoot()
    {
        return root;
    }
    /**
     * @param root 要设置的 root。
     */
    public void setRoot(Element root)
    {
        this.root = root;
    }
    /*全局变量*/
    private String path=null;//xml文件路径
    private Document doc=null;//xml文件对应的document
    private Element root=null;//xml文件的根结点
    private Logger logger=Logger.getLogger(getClass().getName());
}

 

提供了个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的全部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
<think>我们已知用户的问题:如何使用org.w3c.dom解析和处理String类型的XML数据参考引用内容,特别是引用[2]中提到了通过InputStream解析,但用户要求直接处理String类型的数据。思路:1.将String类型的XML数据转换为DOM可以解析的格式,例如通过InputStream或InputSource。2.使用DocumentBuilder解析该输入流,得到Document对象。3.然后就可以使用DOM的各种方法(如getElementsByTagName等)来遍历和处理XML文档。具体步骤:步骤1:将String转换为InputStream或InputSource可以使用ByteArrayInputStream,将字符串按照指定编码转换为字节流。步骤2:创建DocumentBuilderFactory和DocumentBuilder实例步骤3:使用DocumentBuilder的parse方法解析输入流,得到Document对象步骤4:处理Document对象,例如获取根元素,遍历节点等。示例代码:我们将编写个示例方法,展示如何将字符串解析为Document对象,并演示如何获取根元素和遍历部分节点。注意:需要处理异常(如ParserConfigurationException,SAXException,IOException等)根据引用[5]中的XML结构,我们可以假设个示例字符串,然后解析它。另外,引用[3][4]中展示了如何获取节点值。代码结构:1.导入必要的包(java.io.*,javax.xml.parsers.*,org.w3c.dom.*,org.xml.sax.InputSource)2.将字符串转换为输入流,并设置编码(通常为UTF-8)3.创建DocumentBuilderFactory实例4.创建DocumentBuilder5.解析输入流,得到Document6.可选:规范化文档(normalize)7.获取根节点,然后进行遍历由于用户要求处理String类型,我们将重点放在字符串转换到输入流的部分。示例代码:```javaimportjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importorg.w3c.dom.Document;importorg.w3c.dom.NodeList;importorg.xml.sax.InputSource;importjava.io.StringReader;publicclassStringXMLParser{publicstaticvoidmain(String[]args){StringxmlString="<?xmlversion=\"1.0\"encoding=\"UTF-8\"?><School>...</School>";//这里可以是完整的XML字符串,如引用[5]的内容try{//使用InputSource和StringReader将字符串作为输入InputSourceis=newInputSource(newStringReader(xmlString));DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse(is);//可选:规范化文档,将文本节点等合并doc.getDocumentElement().normalize();//获取根元素System.out.println("Rootelement:"+doc.getDocumentElement().getNodeName());//获取所有Student节点NodeListnodeList=doc.getElementsByTagName("Student");//遍历每个Student节点for(inti=0;i< nodeList.getLength();i++){Elementstudent=(Element)nodeList.item(i);//获取子元素的值Stringname=student.getElementsByTagName("Name").item(0).getTextContent();Stringnum=student.getElementsByTagName("Num").item(0).getTextContent();//类似获取其他元素System.out.println("Name:"+name);System.out.println("Num:"+num);}}catch(Exceptione){e.printStackTrace();}}}```说明:-我们使用StringReader将字符串包装为Reader,然后作为InputSource的构造参数。-然后使用DocumentBuilder解析该InputSource。-解析后,就可以按照DOM树结构进行遍历和操作。注意:直接解析字符串时,要确保字符串的编码与XML声明中的编码致。如果不致可能会导致乱码问题。另外,处理XML解析时,还需要注意安全性问题(如XXE攻击),因此建议禁用外部实体:```java//在创建DocumentBuilderFactory后,添加以下设置factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);//或者设置其他属性来避免XXEfactory.setFeature("http://xml.org/sax/features/external-general-entities",false);factory.setFeature("http://xml.org/sax/features/external-parameter-entities",false);```这样,我们就能够安全地解析字符串类型的XML数据了。</think> ### 如何使用 org.w3c.dom 解析 String 类型的 XML 数据 在 Java 中使用 `org.w3c.dom` 解析字符串类型的 XML 数据,需要先将 String 转换为 DOM 可处理的输入源。以下是具体步骤和完整实现: --- #### 完整解析流程 1. **创建输入源** 将 String 转换为 `InputSource`: ```java InputSource inputSource = new InputSource(new StringReader(xmlString)); ``` 2. **初始化 DOM 解析器** ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); ``` 3. **禁用外部实体(安全防护)** ```java factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 防止XXE攻击 factory.setFeature("http://xml.org/sax/features/external-general-entities", false); ``` 4. **解析为 Document 对象** ```java Document doc = builder.parse(inputSource); doc.getDocumentElement().normalize(); // 合并相邻文本节点 ``` 5. **遍历与提取数据** 使用 DOM 方法访问节点: ```java NodeList studentNodes = doc.getElementsByTagName("Student"); for (int i = 0; i < studentNodes.getLength(); i++) { Element student = (Element) studentNodes.item(i); String name = student.getElementsByTagName("Name").item(0).getTextContent(); String classes = student.getElementsByTagName("Classes").item(0).getTextContent(); // 其他字段同理... } ``` --- #### 完整代码示例 ```java import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.StringReader; import org.xml.sax.InputSource; public class StringXmlParser { public static void main(String[] args) throws Exception { String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<School>\n" + " <Student>\n" + " <Name>沈浪</Name>\n" + " <Classes>信管2</Classes>\n" + " </Student>\n" + "</School>"; // 1. 创建输入源 InputSource inputSource = new InputSource(new StringReader(xmlString)); // 2. 配置解析器 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); // 安全设置 DocumentBuilder builder = factory.newDocumentBuilder(); // 3. 解析XML Document doc = builder.parse(inputSource); doc.getDocumentElement().normalize(); // 4. 提取数据 NodeList students = doc.getElementsByTagName("Student"); for (int i = 0; i < students.getLength(); i++) { Element student = (Element) students.item(i); String name = student.getElementsByTagName("Name").item(0).getTextContent(); String classes = student.getElementsByTagName("Classes").item(0).getTextContent(); System.out.println("学生姓名: " + name); System.out.println("班级: " + classes); } } } ``` --- #### 关键点说明 1. **安全处理** 通过 `setFeature()` 禁用外部实体,可有效防御 XXE(XML外部实体注入)攻击[^1]。 2. **字符串处理** 使用 `StringReader` 将 String 转为 DOM 可接受的 `InputSource`,避免文件依赖。 3. **数据提取** - `getElementsByTagName("标签名")` 获取节点列表 - `item(0).getTextContent()` 提取文本内容 - `getDocumentElement()` 获取根节点 --- #### 常见应用场景 1. 解析网络请求返回的XML报文 2. 处理内存中的XML配置字符串 3. 转换数据库存储的XML文本数据 4. 测试场景下的快速XML解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值