Xml dom - littleboy12580/learning_python GitHub Wiki
XML DOM 是用于获取、更改、添加或删除 XML 元素的标准
DOM 将 XML 文档作为一个树形结构,而树叶被定义为节点,示例如下:
这颗节点树展示了节点的集合,以及它们之间的联系。这棵树从根节点开始,然后在树的最低层级向文本节点长出枝条
节点树中的节点彼此之间都有等级关系,父、子和同级节点用于描述这种关系;父节点拥有子节点,位于相同层级上的子节点称为同级节点(兄弟或姐妹)
- 在节点树中,顶端的节点成为根节点
- 根节点之外的每个节点都有一个父节点
- 节点可以有任何数量的子节点
- 叶子是没有子节点的节点
- 同级节点是拥有相同父节点的节点
DOM的结构规定如下:
- 整个文档是一个文档节点
- 每个 XML 标签是一个元素节点
- 包含在 XML 元素中的文本是文本节点
- 每一个 XML 属性是一个属性节点
- 注释属于注释节点
注意:元素节点的文本是存储在文本节点中的,而不是说元素节点包含文本。例如:
<year>2005</year>
元素节点 ,拥有一个值为 "2005" 的文本节点;"2005" 不是 元素的值
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 永远是 #text
- 文档节点的 nodeName 永远是 #document
nodeValue 属性规定节点的值
- 元素节点的 nodeValue 是 undefined
- 文本节点的 nodeValue 是文本自身
- 属性节点的 nodeValue 是属性的值
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 中,每种成分都是节点。元素节点没有文本值;元素节点的文本存储在子节点中。该节点称为文本节点;获取元素文本的方法,就是获取这个子节点(文本节点)的值;
步骤:
- getElementsByTagName() 方法返回包含拥有指定标签名的所有元素的节点列表
- childNodes 属性返回子节点的列表
- 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 属性来替换文本节点中数据
- 使用createElement() 方法创建新的元素节点
- 使用createAttribute() 方法创建新的属性节点
- 使用setAttribute() 方法创建新属性
- 使用createTextNode() 方法创建新的文本节点
- 使用createCDATASection() 方法创建一个新的 CDATA section 节点
- 使用createComment() 方法创建一个新的注释节点
- 使用appendChild() 方法向已存在的节点添加子节点;新节点会添加(追加)到任何已存在的子节点之后
- 使用insertBefore() 方法用于在指定的子节点之前插入节点;如果 insertBefore() 的第二个参数是 null,新节点将添加到最后一个已有的子节点之后; x.insertBefore(newNode,null) 和 x.appendChild(newNode) 都可以向 x 追加一个新的子节点
- 不存在addAttribute()方法,可以通过setAttribute()方法来创建新属性
- 使用insertData() 方法将数据插入已有的文本节点中
insertData() 方法有两个参数:- offset - 在何处开始插入字符(以 0 开始)
- string - 要插入的字符串
使用cloneNode() 方法创建指定节点的副本;cloneNode() 方法有一个参数(true 或 false);该参数指示被复制的节点是否包括原节点的所有属性和子节点