Xml dom - littleboy12580/learning_python GitHub Wiki

XML DOM 是用于获取、更改、添加或删除 XML 元素的标准

DOM结构

DOM 将 XML 文档作为一个树形结构,而树叶被定义为节点,示例如下:
dom结构实例图
这颗节点树展示了节点的集合,以及它们之间的联系。这棵树从根节点开始,然后在树的最低层级向文本节点长出枝条
节点树中的节点彼此之间都有等级关系,父、子和同级节点用于描述这种关系;父节点拥有子节点,位于相同层级上的子节点称为同级节点(兄弟或姐妹)

  • 在节点树中,顶端的节点成为根节点
  • 根节点之外的每个节点都有一个父节点
  • 节点可以有任何数量的子节点
  • 叶子是没有子节点的节点
  • 同级节点是拥有相同父节点的节点

DOM的结构规定如下:

  • 整个文档是一个文档节点
  • 每个 XML 标签是一个元素节点
  • 包含在 XML 元素中的文本是文本节点
  • 每一个 XML 属性是一个属性节点
  • 注释属于注释节点

注意:元素节点的文本是存储在文本节点中的,而不是说元素节点包含文本。例如:

<year>2005</year>

元素节点 ,拥有一个值为 "2005" 的文本节点;"2005" 不是 元素的值

DOM属性和方法

XML有一些常用属性:

  • x.nodeName - x 的名称
  • x.nodeValue - x 的值
  • x.nodeType - x 的类型
  • x.parentNode - x 的父节点
  • x.childNodes - x 的子节点
  • x.attributes - x 的属性节点

在xml中,每个节点都是一个对象;对于xml文档对象xmlDoc,documentElement 属性表示的是根节点

nodeName 属性

nodeName 属性规定节点的名称

  • nodeName 是只读的
  • 元素节点的 nodeName 与标签名相同
  • 属性节点的 nodeName 是属性的名称
  • 文本节点的 nodeName 永远是 #text
  • 文档节点的 nodeName 永远是 #document

nodeValue 属性

nodeValue 属性规定节点的值

  • 元素节点的 nodeValue 是 undefined
  • 文本节点的 nodeValue 是文本自身
  • 属性节点的 nodeValue 是属性的值

nodeType 属性

nodeType 属性规定节点的类型
nodeType 是只读的
一些比较重要的节点类型如下:

元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9

XML有一些常用方法:

  • x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
  • x.appendChild(node) - 向 x 插入子节点
  • x.removeChild(node) - 从 x 删除子节点

例如有一个xml文件为books.xml
通过以下代码

xmlDoc=loadXMLDoc("books.xml");

document.write(xmlDoc.getElementsByTagName("title")
[0].childNodes[0].nodeValue);
document.write("<br />");
document.write(xmlDoc.getElementsByTagName("author")
[0].childNodes[0].nodeValue);
document.write("<br />");
document.write(xmlDoc.getElementsByTagName("year")
[0].childNodes[0].nodeValue);

可以得到以下结果

Harry Potter
J K. Rowling
2005

DOM节点操作

获取节点值

获取元素值

在 DOM 中,每种成分都是节点。元素节点没有文本值;元素节点的文本存储在子节点中。该节点称为文本节点;获取元素文本的方法,就是获取这个子节点(文本节点)的值;
步骤:

  1. getElementsByTagName() 方法返回包含拥有指定标签名的所有元素的节点列表
  2. childNodes 属性返回子节点的列表
  3. nodeValue 属性返回文本节点的文本值

如下例所示:

xmlDoc=loadXMLDoc("books.xml");
x=xmlDoc.getElementsByTagName("title")[0];
y=x.childNodes[0];
txt=y.nodeValue;

获取属性值

在 DOM 中,属性也是节点。与元素节点不同,属性节点拥有文本值;获取属性的值的方法,就是获取它的文本值;可以通过使用 getAttribute() 方法或属性节点的 nodeValue 属性来完成这个任务
1.getAttribute() 方法

xmlDoc=loadXMLDoc("books.xml");
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");

2.nodeValue 属性
使用getAttributeNode() 方法返回属性节点,在通过nodeValue属性获取属性值

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

改变节点值

可以通过使用nodeValue属性,在获取到节点值或属性值之后来改变他们的值;例如:

xmlDoc=loadXMLDoc("books.xml");
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
x.nodeValue="Hello World";
x=xmlDoc.getElementsByTagName("book")[0]
y=x.getAttributeNode("category");
y.nodeValue="child";

对于属性还可以使用setAttribute() 方法改变已有属性的值,或创建新属性;例如:

xmlDoc=loadXMLDoc("books.xml");
x=xmlDoc.getElementsByTagName('book');
x[0].setAttribute("category","child");

删除节点

  • 使用removeChild() 方法来删除指定的节点
  • 使用x.parentNode.removeChild(x)方法来删除已定位的节点
  • 使用removeAttribute(name) 方法用于根据名称删除属性节点
  • 使用removeAttributeNode(node) 方法通过使用 Node 对象作为参数,来删除属性节点
  • 通过将nodeValue 属性的值设为空("")来清空文本节点的值

替换节点

  • 使用replaceChild() 方法来替换节点
  • 使用replaceData() 方法来替换文本节点中的数据
    replaceData() 方法有三个参数:
    • offset - 在何处开始替换字符;Offset 值以 0 开始
    • length - 要替换多少字符
    • string - 要插入的字符串
  • 使用 nodeValue 属性来替换文本节点中数据

创建节点

  1. 使用createElement() 方法创建新的元素节点
  2. 使用createAttribute() 方法创建新的属性节点
  3. 使用setAttribute() 方法创建新属性
  4. 使用createTextNode() 方法创建新的文本节点
  5. 使用createCDATASection() 方法创建一个新的 CDATA section 节点
  6. 使用createComment() 方法创建一个新的注释节点

添加节点

  1. 使用appendChild() 方法向已存在的节点添加子节点;新节点会添加(追加)到任何已存在的子节点之后
  2. 使用insertBefore() 方法用于在指定的子节点之前插入节点;如果 insertBefore() 的第二个参数是 null,新节点将添加到最后一个已有的子节点之后; x.insertBefore(newNode,null) 和 x.appendChild(newNode) 都可以向 x 追加一个新的子节点
  3. 不存在addAttribute()方法,可以通过setAttribute()方法来创建新属性
  4. 使用insertData() 方法将数据插入已有的文本节点中
    insertData() 方法有两个参数:
    • offset - 在何处开始插入字符(以 0 开始)
    • string - 要插入的字符串

克隆节点

使用cloneNode() 方法创建指定节点的副本;cloneNode() 方法有一个参数(true 或 false);该参数指示被复制的节点是否包括原节点的所有属性和子节点

参考链接

XMLDOM对象方法手册
w3school XML DOM教程

⚠️ **GitHub.com Fallback** ⚠️