DOM 节点遍历:掌握遍历 XML文档结构和内容的技巧

news2024/11/26 23:26:22

遍历是指通过或遍历节点树

遍历节点树

通常,您想要循环一个 XML 文档,例如:当您想要提取每个元素的值时。

这被称为"遍历节点树"。

下面的示例循环遍历所有 <book> 的子节点,并显示它们的名称和值:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>";

parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");

// documentElement 总是代表根节点
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
    txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>

</body>
</html>

输出:

title: Everyday Italian
author: Giada De Laurentiis
year: 2005

示例解释

  • 将 XML 字符串加载到 xmlDoc
  • 获取根元素的子节点
  • 对于每个子节点,输出节点名称和文本节点的节点值

浏览器中 DOM 解析的差异

浏览器之间存在一些差异。其中一个重要的差异是:

  • 它们如何处理空格和换行符

DOM - 空格和换行符

XML 经常包含节点之间的换行符或空格字符。当文档由简单编辑器(如记事本)编辑时,通常会出现这种情况。

以下示例(由记事本编辑)在每行之间包含 CR/LF(换行符),并在每个子节点之前包含两个空格:

<book>
  <title>Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

Internet Explorer 9 及更早版本不会将空格或换行符视为空格文本节点,而其他浏览器会。

以下示例将输出根元素(books.xml)的子节点数。IE9 及更早版本将输出 4 个子节点,而 IE10 及更高版本以及其他浏览器将输出 9 个子节点:

function myFunction(xml) {
  var xmlDoc = xml.responseXML;
  x = xmlDoc.documentElement.childNodes;
  document.getElementById("demo").innerHTML =
    "Number of child nodes: " + x.length;
}

PCDATA - 解析字符数据

XML 解析器通常解析 XML 文档中的所有文本。

当解析 XML 元素时,还会解析 XML 标签之间的文本:

<message>This text is also parsed</message>

解析器执行此操作是因为 XML 元素可以包含其他元素,如此示例中的 <name> 元素包含两个其他元素(first 和 last):

<name><first>Bill</first><last>Gates</last></name>

解析器将其拆分为子元素,如下所示:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>

解析字符数据(PCDATA)是一个用于指代将由 XML 解析器解析的文本数据的术语。

CDATA - 未解析的字符数据

术语 CDATA 用于指代 XML 解析器不应解析的文本数据。

字符如 “<” 和 “&” 在 XML 元素中是非法的。

“<” 会生成错误,因为解析器将其解释为新元素的开始。

“&” 会生成错误,因为解析器将其解释为字符实体的开始。

一些文本,比如 JavaScript 代码,包含许多 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分以 “<![CDATA[" 开始,以 "]]>” 结束:

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    } else {
        return 0;
    }
}
]]>
</script>

在上面的示例中,CDATA 部分内的所有内容都会被解析器忽略。

关于 CDATA 部分的注意事项:

  • CDATA 部分不能包含字符串 “]]>”。不允许嵌套 CDATA 部分。
  • 表示 CDATA 部分结束的 “]]>” 不能包含空格或换行符。

XML DOM - 导航节点

可以使用节点之间的关系来导航节点。

导航 DOM 节点

通过节点之间的关系在节点树中访问节点

,通常被称为"导航节点"。

在 XML DOM 中,节点关系被定义为节点的属性:

  • parentNode
  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

以下图像说明了 books.xml 中的节点树的一部分以及节点之间的关系:

在这里插入图片描述

DOM - 父节点

所有节点都有一个父节点。以下代码导航到 <book> 的父节点:

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    var x = xmlDoc.getElementsByTagName("book")[0];
    document.getElementById("demo").innerHTML = x.parentNode.nodeName;
}

示例解释:

  • 将 books.xml 加载到 xmlDoc
  • 获取第一个 <book> 元素
  • 输出 “x” 的父节点的节点名称

避免空文本节点

某些浏览器可能将空白空格或换行符视为文本节点。

在使用属性如 firstChildlastChildnextSiblingpreviousSibling 时,这会导致问题。

为了避免导航到空文本节点(元素节点之间的空格和换行符),我们使用一个检查节点类型的函数:

function get_nextSibling(n) {
    var y = n.nextSibling;
    while (y.nodeType != 1) {
        y = y.nextSibling;
    }
    return y;
}

上述函数允许您使用 get_nextSibling(node) 而不是属性 node.nextSibling

代码解释:

  • 元素节点的类型为 1。如果兄弟节点不是元素节点,则移动到下一个节点,直到找到一个元素节点。
  • 获取下一个是元素节点的兄弟节点。

获取第一个子元素

以下代码显示了第一个 <book> 的第一个元素节点:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        myFunction(this);
    }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
    var x = get_firstChild(xmlDoc.getElementsByTagName("book")[0]);
    document.getElementById("demo").innerHTML = x.nodeName;
}

// 检查第一个节点是否是元素节点
function get_firstChild(n) {
    var y = n.firstChild;
    while (y.nodeType != 1) {
        y = y.nextSibling;
    }
    return y;
}
</script>

</body>
</html>

输出:

title

示例解释

  • 将 books.xml 加载到 xmlDoc
  • 在第一个 <book> 元素节点上使用 get_firstChild 函数,获取第一个子节点,该子节点是一个元素节点
  • 输出是第一个是元素节点的子节点的节点名称

更多示例

  • lastChild(): 使用 lastChild() 方法和自定义函数获取节点的最后一个子节点。
  • nextSibling(): 使用 nextSibling() 方法和自定义函数获取节点的下一个兄弟节点。
  • previousSibling(): 使用 previousSibling() 方法和自定义函数获取节点的前一个兄弟节点。

XML DOM 获取节点值

nodeValue 属性用于获取节点的文本值。

getAttribute() 方法返回属性的值。

获取元素的值

在 DOM 中,一切都是节点。元素节点没有文本值。元素节点的文本值存储在子节点中,这个节点被称为文本节点。要检索元素的文本值,必须检索元素的文本节点的值。

getElementsByTagName 方法

getElementsByTagName() 方法按照它们在源文档中出现的顺序,返回指定标签名的所有元素的节点列表。假设 books.xml 已加载到 xmlDoc

此代码检索第一个 <title> 元素:

var x = xmlDoc.getElementsByTagName("title")[0];

childNodes 属性

childNodes 属性返回元素的所有子节点的列表。以下代码检索第一个 <title> 元素的文本节点:

x = xmlDoc.getElementsByTagName("title")[0];
y = x.childNodes[0];

nodeValue 属性

nodeValue 属性返回文本节点的文本值。以下代码检索第一个 <title> 元素的文本节点的文本值:

x = xmlDoc.getElementsByTagName("title")[0];
y = x.childNodes[0];
z = y.nodeValue;

结果在 z 中:“Everyday Italian”

完整示例

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        myFunction(this);
    }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
    var x = xmlDoc.getElementsByTagName('title')[0];
    var y = x.childNodes[0];
    document.getElementById("demo").innerHTML = y.nodeValue;
}
</script>

</body>
</html>

循环遍历所有 <title> 元素

获取属性值

在 DOM 中,属性也是节点。与元素节点不同,属性节点具有文本值。获取属性值的方式是获取其文本值。

获取属性值 - getAttribute()

getAttribute() 方法返回属性的值。以下代码检索第一个 <title> 元素的 “lang” 属性的文本值:

x = xmlDoc.getElementsByTagName("title")[0];
txt = x.getAttribute("lang");

结果在 txt 中:“en”

循环遍历所有 <book> 元素并获取它们的 “category”

获取属性值 - getAttributeNode()

getAttributeNode() 方法返回属性节点。以下代码检索第一个 <title> 元素的 “lang” 属性的文本值:

x = xmlDoc.getElementsByTagName("title")[0];
y = x.getAttributeNode("lang");
txt = y.nodeValue;

XML DOM 更改节点值

nodeValue 属性用于更改节点的值。

setAttribute() 方法用于更改属性值。

更改元素的值

在 DOM 中,一切都是节点。元素节点没有文本值。元素节点的文本值存储在子节点中,这个节点被称为文本节点。要更改元素的文本值,必须更改元素的文本节点的值。

更改文本节点的值

nodeValue 属性可用于更改文本节点的值。此代码更改第一个 <title> 元素的文本节点值:

xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue = "new content";

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 获取 <title> 元素的第一个子节点。
  • 将节点值更改为 “new content”。

循环遍历并更改所有 <title> 元素的文本节点

更改属性的值

在 DOM 中,属性也是节点。与元素节点不同,属性节点具有文本值。更改属性值的方式是更改其文本值。

使用 setAttribute() 更改属性

setAttribute() 方法更改属性的值。如果属性不存在,则会创建一个新属性。

此代码更改 <book> 元素的 category 属性:

xmlDoc.getElementsByTagName("book")[0].setAttribute("category", "food");

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 获取第一个 <book> 元素。
  • 将 “category” 属性值更改为 “food”。

循环遍历所有 <title> 元素并添加

使用 nodeValue 更改属性

nodeValue 属性是属性节点的值。更改 value 属性会更改属性的值。

xmlDoc.getElementsByTagName("book")[0].getAttributeNode("category").nodeValue = "food";

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 获取第一个 <book> 元素的 “category” 属性。
  • 将属性节点的值更改为 “food”。

XML DOM 删除节点

删除元素节点

removeChild() 方法删除指定的节点。当删除节点时,它的所有子节点也会被删除。

此代码将从加载的 xml 中删除第一个 <book> 元素:

y = xmlDoc.getElementsByTagName("book")[0];
xmlDoc.documentElement.removeChild(y);

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 将变量 y 设置为要删除的元素节点。
  • 使用 removeChild() 方法从父节点中删除元素节点。

删除自己 - 删除当前节点

removeChild() 方法是删除指定节点的唯一方法。当您导航到要删除的节点时,可以使用 parentNode 属性和 removeChild() 方法来删除该节点:

x = xmlDoc.getElementsByTagName("book")[0];
x.parentNode.removeChild(x);

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 将变量 y 设置为要删除的元素节点。
  • 使用 parentNode 属性和 removeChild() 方法删除元素节点。

删除文本节点

removeChild() 方法也可以用于删除文本节点:

x = xmlDoc.getElementsByTagName("title")[0];
y = x.childNodes[0];
x.removeChild(y);

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 将变量 x 设置为第一个 title 元素节点。
  • 将变量 y 设置为要删除的文本节点。
  • 使用 removeChild() 方法从父节点中删除元素节点。

使用 removeChild() 仅仅为了删除节点的文本不是很常见。可以使用 nodeValue 属性代替。请参阅下一段。

清除文本节点

nodeValue 属性可用于更改文本节点的值:

xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue = "";

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 获取第一个 title 元素的第一个子节点。
  • 使用 nodeValue 属性清除文本节点的文本。

通过名称删除属性节点

removeAttribute() 方法按名称删除属性节点。

示例: removeAttribute('category')

此代码将删除第一个 <book> 元素中的 “category” 属性:

x = xmlDoc.getElementsByTagName("book");
x[0].removeAttribute("category");

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 使用 getElementsByTagName() 获取 book 节点。
  • 从第一个 book 元素节点中删除 “category” 属性。

循环遍历并删除所有 <book> 元素的 “category”

通过对象删除属性节点

removeAttributeNode() 方法使用节点对象作为参数删除属性节点。

示例: removeAttributeNode(x)

此代码将删除所有 <book> 元素的所有属性:

x = xmlDoc.getElementsByTagName("book");

for (i = 0; i < x.length; i++) {
    while (x[i].attributes.length > 0) {
        attnode = x[i].attributes[0];
        old_att = x[i].removeAttributeNode(attnode);
    }
}

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 使用 getElementsByTagName() 获取所有 book 节点。
  • 对于每个 book 元素,检查是否有任何属性。
  • book 元素中存在属性时,删除属性

XML DOM 添加节点

添加节点 - appendChild()

appendChild() 方法将子节点添加到现有节点。新节点在任何现有子节点之后被添加(追加)。注意:如果节点的位置很重要,请使用 insertBefore()

此代码片段创建一个元素(<edition>),并将其添加在第一个 <book> 元素的最后一个子节点之后:

newEle = xmlDoc.createElement("edition");
xmlDoc.getElementsByTagName("book")[0].appendChild(newEle);

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 创建一个新节点 <edition>
  • 将节点追加到第一个 <book> 元素。

此代码片段与上述相同,但新元素添加了一个值:

newEle = xmlDoc.createElement("edition");
newText = xmlDoc.createTextNode("first");
newEle.appendChild(newText);

xmlDoc.getElementsByTagName("book")[0].appendChild(newEle);

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 创建一个新节点 <edition>
  • 创建一个新文本节点 “first”。
  • 将文本节点追加到 <edition> 节点。
  • <edition> 节点追加到 <book> 元素。

插入节点 - insertBefore()

insertBefore() 方法在指定的子节点之前插入一个节点。当添加的节点的位置很重要时,此方法很有用:

newNode = xmlDoc.createElement("book");

x = xmlDoc.documentElement;
y = xmlDoc.getElementsByTagName("book")[3];

x.insertBefore(newNode, y);

示例解释:

  • 假设 books.xml 已加载到 xmlDoc
  • 创建一个新元素节点 <book>
  • 在最后一个 <book> 元素节点之前插入新节点。
  • 如果 insertBefore() 的第二个参数为 null,新节点将在最后一个现有子节点之后添加。x.insertBefore(newNode, null)x.appendChild(newNode) 都将向 x 添加一个新的子节点。

添加新属性

setAttribute() 方法设置属性的值:

xmlDoc.getElementsByTagName('book')[0].setAttribute("edition", "first");

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 为第一个 <book> 元素的 “edition” 属性设置值为 “first”。

注意: 没有名为 addAttribute() 的方法。如果属性不存在,setAttribute() 将创建一个新属性。如果属性已存在,setAttribute() 方法将覆盖现有值。

向文本节点添加文本 - insertData()

insertData() 方法将数据插入现有文本节点。insertData() 方法有两个参数:offset - 开始插入字符的位置(从零开始),string - 要插入的字符串。

以下代码片段将 “Easy” 添加到已加载 XML 的第一个 <title> 元素的文本节点中:

xmlDoc.getElementsByTagName("title")[0].childNodes[0].insertData(0, "Easy ");

XML DOM 克隆节点

克隆节点

cloneNode() 方法创建指定节点的副本。cloneNode() 方法有一个参数(true 或 false)。此参数指示克隆的节点是否应包括原始节点的所有属性和子节点。

以下代码片段复制第一个 <book> 节点并将其附加到文档的根节点:

oldNode = xmlDoc.getElementsByTagName('book')[0];
newNode = oldNode.cloneNode(true);
xmlDoc.documentElement.appendChild(newNode);

结果

Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML
Everyday Italian

示例解释

  • 假设 books.xml 已加载到 xmlDoc
  • 获取要复制的节点(oldNode)。
  • 将节点克隆到 “newNode”。
  • 将新节点附加到 XML 文档的根节点。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交替子数组计数 - 力扣题解

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

设计模式(一)简介

一、书籍推荐及博客 大话设计模式 设计模式的艺术 XXL开源社区 | 博客 二、通俗版概念 创建型模式、结构型模式、行为型模式 怎么建房子、建什么样的房子、建的房子有什么用 三、重点模式及简述 1、创建型模式 工厂方法&#xff08;多态工厂的实现&#xff09; 抽象工厂…

JAVA流 学习思考

1. 水在前面 接着上周的Lambda表达式&#xff0c;这周学习了流。说实话作为工具来讲&#xff0c;这玩意好像挺强大的&#xff0c;倒是真要掌握这工具貌似要记住不少东西&#xff0c;年纪大了不想背书的可以看看这篇水文&#xff0c;等到用的时候再根据具体的使用找度娘。&#…

常用技术-Timer定时器

什么是Timer Timer是JDK自带的任务调度工具类&#xff0c;只需要java.util.Timer和java.util.TimerTask两个类就可以实现基本任务调度功能 Timer是一种线程设施&#xff0c;用于安排以后在后台线程中执行的任务。可安排任务执行一次&#xff0c;或者定期重复执行&#xff0c;…

谈谈配置中心?

配置中心可以做集中式的服务配置管理&#xff0c;比如配置一些数据库连接的URL&#xff0c;一些共用的配置且可动态调整的参数。如果不采用集中式的管理&#xff0c;会导致修改起来特别麻烦&#xff0c;一个个的修改特别繁琐。 Nacos Config配置中心中采用的是客户端拉取数据&a…

腾讯云轻量应用服务器“月流量”限制?流量不够怎么办?

腾讯云轻量应用服务器套餐带流量包&#xff0c;就是有月流量限制的意思&#xff0c;超出轻量套餐的流量需要另外支付流量费&#xff0c;轻量服务器地域不同超额流量费用也不同&#xff0c;北京上海广州等中国内地地域流量价格是0.8元每GB&#xff0c;中国香港地域流量价格是1元…

Xilinx IDDR及ODDR使用和仿真

平台&#xff1a;Vivado2018 官方相关文档&#xff0c;ug471_7Series_SelectIO.pdf 关于IDDR与ODDR Input DDR Resource(IDDR) 外部的数据在时钟的上下沿同时传输数据&#xff0c;我们可以使用IDDR原语将输入的单bit数据转化为2bit的数据输出。同时数据速率变为原来的二分之一…

python的Web框架比较

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 之前好像写过一些关于Python的Web框架?现在再按照ASGI与原本的WSGI区分一下,顺便把框架(framework)与库(library)区分一下. 之前我也写过(或者说想过)一些类似生态以及作用的框架进行比较,大多都是看看网上评价以及s…

微服务demo(三)nacosfeign

一、feign使用 1、集成方法 1.1、pom consumer添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version></dependency&…

算法学习——LeetCode力扣补充篇2

算法学习——LeetCode力扣补充篇2 724. 寻找数组的中心下标 724. 寻找数组的中心下标 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右…

C语言 05 变量与常量

变量 变量就像在数学中学习的 x&#xff0c;y 一样&#xff0c;可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明变量的格式为&#xff1a; 数据类型 变量名称 初始值;&#xff08;其中初始值可以不用在定义变量时设定&#xff09; 是赋值操作…

【python】常用函数汇总(持续更新……)

文章目录 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828【np.dot()】矩阵相乘【np.linalg.inv()】矩阵求逆 【numpy.exp()】返回e的幂次方&#xff0c;e是一个常数为2.71828 举例&#xff1a;numpy.exp() 【np.dot()】矩阵相乘 【要点】 1、前者的列数后者…

Springboot之RESTful风格

目录 1、概述&#xff1a; 1.1、传统风格的API&#xff1a; 1.2、RESTful风格的API&#xff1a; 1.3、GET、POST、PUT、DELETE&#xff1a; 2、RESTful风格相关的注解&#xff1a; ①PathVariable&#xff0c;用来获取url中的数据&#xff1b; ②GetMapping&#xff0c;接…

Xcode删除原本的Git,再添加新的git

本文参考&#xff1a;Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1&#xff0c;此时项目A内部已经存在一个Git文件&#xff0c;与server1相关联。 此时你想将项目A提交到 另一个Git…

SSH免密登录——linux

SSH免密登录——linux 方法一一、用 ssh-key-gen 在本地主机上创建公钥和密钥二、用 ssh-copy-id 把客户端公钥追加到远程主机的 .ssh/authorized_key 上三、直接登录远程主机 方法二一、将生成的客户端公钥id_rsa.pub内容追加至目标主机.ssh/authorized_key 中参考链接 SSH免密…

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)

我的代码是这样的 <el-collapseref"collapse"v-model"active"accordionclass"collapseStart"change"collapsechange"><el-collapse-item:name"String(index 1)"v-for"(i, index) in List":key"in…

程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

程序员/后端开发方向Java 跳槽注意事项&#xff08;简历和面试经验分享&#xff09; 应届生面试经验参考&#xff1a;https://www.cnblogs.com/rainbow-1/p/16779048.html 简历&#xff1a; 1、个人感觉还是要写真话&#xff0c;包装的内容要有一定的基础&#xff0c;问起来能…

数据结构——lesson13排序之计数排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…