利用Node读取和修改数据

本文介绍如何使用Node.js读取和修改XML数据。通过Node对象提供的API,可以方便地获取XML文件中的信息,包括读取books.xml文件的内容,并进行数据更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      Node是所有类型节点的父节点,Node提供了读取数据的方法,可以通过Node对象的各个API获得相应的信息。

所需的xml文件:books.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book1 id="1">
		<name>冰与雪之歌</name>
		<author>乔治马丁</author>
		<year>2014</year>
		<price>89</price>
	</book1>
	<book2 id="2">
		<name>童话大王</name>
		<author>郑渊洁</author>
		<year>2005</year>
		<price>70</price>
		<language>English</language>
	</book2>
</bookstore>

一、读取数据

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Test02 {

	public static void main(String[] args) throws Exception {
			//   一、创建一个DocumentBuliderFactory的对象
			DocumentBuilderFactory dbf=	DocumentBuilderFactory.newInstance();
			//   二、创建一个DocumentBuilder对象
			DocumentBuilder db=	dbf.newDocumentBuilder();
			//通过DocumentBuilder的Parse()方法加载books.xml到当前项目下
			Document document=	db.parse("books.xml");
			//获取根节点
			Node root =document.getFirstChild();
			System.out.println("根节点名称为:"+root.getNodeName());
			System.out.println("根节点类型为:"+root.getNodeType());
			//显示所有子节点
			NodeList list = root.getChildNodes();
			for(int i=0;i<list.getLength();i++)
			{
				Node node =list.item(i);//获取某个位置的Node,位置从0开始算起
				if(!(node.getNodeType()==Node.TEXT_NODE && node.getTextContent().trim().length()==0))
					//如果节点是文本类型并且内容为空白,则不显示
				{
				System.out.println(node.getNodeName());
				}
			}
	}

}


二、修改数据

import java.io.File;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
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.Node;
import org.w3c.dom.NodeList;

public class Test03 {

	public static void main(String[] args) throws Exception 
	{
		//创建一个DocumentBuliderFactory的对象
		DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
	   //创建一个DocumentBuilder对象
		DocumentBuilder db= dbf.newDocumentBuilder();
		//通过DocumentBuilder的Parse()方法加载books.xml到当前项目下
		Document doc = db.parse("books.xml");
		//获得所有price 节点
		NodeList list = doc.getElementsByTagName("price");
		ArrayList arrayList = new ArrayList();
		Node books=null;
		for(int i=0;i<list.getLength();i++)
		{
			
			Node priceNode = list.item(i);
			String strPrice = priceNode.getTextContent();
			double price=Double.parseDouble(strPrice);
			//获取该价格的父节点(book)
			Node book= priceNode.getParentNode();
			//获取book的父节点books
			books=book.getParentNode();
			if(price >80)
			{
				arrayList.add(book);
			}
			else
			{
				books.removeChild(book);
			}
			
		}
		//创建TransformerFactory对象
		TransformerFactory tff=TransformerFactory.newInstance();
		try {
			//创建Transformer对象
				Transformer tf= tff.newTransformer();
				tf.setOutputProperty(OutputKeys.INDENT, "yes");//使属性换行
				tf.transform(new DOMSource(doc),new StreamResult(new File("newbooks.xml")));
			} 
		catch (TransformerException e) 
		{
				// TODO Auto-generated catch block
				e.printStackTrace();
		}

	}

}




### 使用 Node.js 读取 MQTT 数据并存储到 MySQL 的解决方案 以下是实现使用 Node.js 读取 MQTT 数据并将数据存储到 MySQL 数据库中的完整方案。 #### 安装依赖项 为了完成此任务,需要安装以下 npm 包: - **`mqtt`**: 用于处理 MQTT 协议通信。 - **`mysql2`**: 用于与 MySQL 数据库交互。 可以使用以下命令来安装这些依赖项: ```bash npm install mqtt mysql2 ``` --- #### 示例代码 以下是一个完整的示例程序,展示如何订阅 MQTT 主题、接收消息,并将接收到的数据保存到 MySQL 数据库中: ```javascript const mqtt = require('mqtt'); // 引入 MQTT 库 [^1] const mysql = require('mysql2/promise'); // 引入 MySQL 库 [^3] // 创建 MQTT 客户端实例 const client = mqtt.connect('mqtt://broker.hivemq.com', { clientId: 'nodejs_mqtt_to_mysql', clean: true, }); // 配置 MySQL 数据库连接池 const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'sensor_data' }); // 处理 MQTT 连接事件 client.on('connect', async () => { console.log('Connected to MQTT broker'); try { await client.subscribe('sensors/temperature/humidity', { qos: 0 }); console.log('Subscribed to topic sensors/temperature/humidity'); } catch (error) { console.error('Error subscribing:', error.message); } }); // 接收 MQTT 消息并写入数据库 client.on('message', async (topic, message) => { const payload = JSON.parse(message.toString()); // 解析 JSON 格式的负载 [^4] const { temperature, humidity, timestamp, clientId } = payload; if (!temperature || !humidity || !timestamp || !clientId) { console.warn('Invalid data received from MQTT.'); return; } try { const sqlQuery = ` INSERT INTO temp_hum ( up_timestamp, client_id, temp, hum ) VALUES (?, ?, ?, ?) `; const result = await pool.query(sqlQuery, [ new Date(timestamp).toISOString(), // 转换时间戳为 ISO 字符串 clientId, parseFloat(temperature), parseFloat(humidity) ]); console.log(`Inserted record with ID ${result[0].insertId}`); } catch (err) { console.error('Database insertion failed:', err.message); } }); // 错误处理 client.on('error', (err) => { console.error('MQTT Client Error:', err.message); }); ``` --- #### 关键点说明 1. **MQTT 订阅主题** 上述代码中,客户端订阅的主题为 `sensors/temperature/humidity`。可以根据实际需求调整主题名称[^1]。 2. **JSON 数据解析** 假设从 MQTT 收到的消息是以 JSON 格式传递的,其中包含温度 (`temperature`) 湿度 (`humidity`) 等字段。如果格式不同,则需相应修改解析逻辑[^4]。 3. **SQL 插入操作** 利用预定义的 SQL 查询语句向名为 `temp_hum` 的表插入新记录。该表结构已在引用中描述[^3]。 4. **异常捕获机制** 对于可能发生的错误(如网络中断或数据库查询失败),均设置了相应的日志输出以便排查问题。 --- #### 注意事项 - 如果目标环境未配置 JDK 或其他 Java 组件,请忽略相关内容[^5]。 - 确保 MySQL 数据库已启动且具备访问权限;同时确认所使用的用户名密码正确无误。 - 测试阶段建议启用调试模式以验证各环节功能正常运作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值