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

本文介绍了一个名为XmlCreater的Java类,该类提供了创建DOM并生成XML文件的功能。文章详细展示了如何使用此工具来构建XML文档结构,包括创建根元素、添加子元素及属性等。
XmlCreater.java

 用于创建XML文件

/********************************************************************
 * 项目名称    :rochoc   <p>
 * 包名称      :rochoc.xml.oper <p>
 * 文件名称    :XmlCreater   <p>
 * 编写者     :luoc    <p>
 * 编写日期    :2005-6-22    <p>
 * 程序功能(类)描述 : 创建DOM并生成XML文件      <p>
 * 
 * 程序变更日期   :
 * 变更作者    :
 * 变更说明    :
********************************************************************/
package rochoc.xml.oper;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * 类名:XmlCreater  <p>
 * 类描述: 创建DOM并生成XML文件<p>
 * 编写者 :luoc<p>
 * 编写日期 :2005-6-22<p>
 * 主要public成员变量:<p>
 * 主要public方法:   <p>
 **/

public class XmlCreater
{
    /**
     *构造函数说明:       <p>
     *参数说明:@param path  xml文件路径 <p>
    **/
    public XmlCreater(String path)
    {
        this.path=path;
        init();
    }
    
    /**
    * 方法名称:init<p>
    * 方法功能: 初始化函数           <p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    private void init()
    {
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        try
        {
            DocumentBuilder builder=factory.newDocumentBuilder();
            doc=builder.newDocument();//新建DOM
        }catch(ParserConfigurationException e)
        {
            logger.error("Parse DOM builder error:"+e);
        }
    }
    
    /**
    * 方法名称:createRootElement<p>
    * 方法功能:创建根结点,并返回            <p>
    * 参数说明:@param rootTagName <p>
    * 返回:Element <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public Element createRootElement(String rootTagName)
    {     
        if(doc.getDocumentElement()==null)
        {
            logger.debug("create root element '"+rootTagName+"' success.");
            Element root=doc.createElement(rootTagName);
            doc.appendChild(root);
            return root;
        }
        logger.warn("this dom's root element is exist,create fail.");
        return doc.getDocumentElement();
    }
    
    /**
    * 方法名称:createElement<p>
    * 方法功能:在parent结点下增加子结点tagName<p>
    * 参数说明:@param parent
    * 参数说明:@param tagName <p>
    * 返回:Element <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public Element createElement(Element parent,String tagName)
    {
        Document doc=parent.getOwnerDocument();
        Element child=doc.createElement(tagName);
        parent.appendChild(child);        
        return child;
    }
    
    /**
    * 方法名称:createElement<p>
    * 方法功能:在parent结点下增加值为value的子结点tabName<p>
    * 参数说明:@param parent
    * 参数说明:@param tagName
    * 参数说明:@param value <p>
    * 返回:Element <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public Element createElement(Element parent,String tagName,String value)
    {
        Document doc=parent.getOwnerDocument();
        Element child=doc.createElement(tagName);
        XmlOper.setElementValue(child,value);
        parent.appendChild(child);
        return child;
    }
    
    /**
    * 方法名称:createAttribute<p>
    * 方法功能:在parent结点下增加属性 <p>
    * 参数说明:@param parent
    * 参数说明:@param attrName 属性名
    * 参数说明:@param attrValue 属性值<p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public void createAttribute(Element parent,String attrName,String attrValue)
    {
        XmlOper.setElementAttr(parent,attrName,attrValue);        
    }
    
    /**
    * 方法名称:buildXmlFile<p>
    * 方法功能:根据DOM生成XML文件<p>
    * 参数说明: <p>
    * 返回:void <p>
    * 作者:luoc
    * 日期:2005-6-22
    **/
    public void buildXmlFile()
    {
        TransformerFactory tfactory=TransformerFactory.newInstance();
        try
        {
            Transformer transformer=tfactory.newTransformer();
            DOMSource source=new DOMSource(doc);
            logger.debug("New DOMSource success.");
            StreamResult result=new StreamResult(new File(path));
            logger.debug("New StreamResult success.");
            transformer.setOutputProperty("encoding","GBK");
            transformer.transform(source,result);
            logger.debug("Build XML File '"+path+"' success.");
        }catch(TransformerConfigurationException e)
        {
            logger.error("Create Transformer error:"+e);
        }catch(TransformerException e)
        {
            logger.error("Transformer XML file error:"+e);
        }
    }
    
    /**
     * @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;
    }
    /*全局变量*/
    private Logger logger = Logger.getLogger(getClass().getName());
    private Document doc=null;//新创建的DOM
    private String path=null;//生成的XML文件绝对路径
}

 

基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
<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、付费专栏及课程。

余额充值