XML DOM Element 对象详解(五)
- JavaScript
- 9小时前
- 4热度
- 0评论
在处理 XML 文档时,了解 DOM(Document Object Model)的基本对象和方法是非常重要的。本文将详细介绍 Element、Attr 和 Text 对象,帮助你在 XML 处理中更加得心应手。无论你是初学者还是有经验的开发者,都能从中受益。
什么是 Element 对象?
Element 对象 是 XML 文档中最基本的构建块之一,它代表了一个 XML 元素。一个元素可以包含属性、其他元素或文本。例如,在 <year>2005</year> 中,<year> 是一个元素,而 2005 是一个文本节点。
重要提示
文本永远存储在文本节点中,而不是直接存储在元素节点中。这是许多人在 DOM 处理中容易犯的一个常见错误。例如,<year>2005</year> 中,<year> 是一个元素节点,而 2005 是一个文本节点。
由于 Element 对象 也是一种节点,因此它继承了 Node 对象 的所有属性和方法。
Element 对象的属性
以下是 Element 对象 的一些常用属性:
- attributes: 返回元素的属性的 NamedNodeMap。
- baseURI: 返回元素的绝对基准 URI。
- childNodes: 返回元素的子节点的 NodeList。
- firstChild: 返回元素的第一个子节点。
- lastChild: 返回元素的最后一个子节点。
- localName: 返回元素名称的本地部分。
- namespaceURI: 返回元素的命名空间 URI。
- nextSibling: 返回元素之后紧接的节点。
- nodeName: 返回节点的名称,根据其类型。
- nodeType: 返回节点的类型。
- ownerDocument: 返回元素所属的根元素(document 对象)。
- parentNode: 返回元素的父节点。
- prefix: 设置或返回元素的命名空间前缀。
- previousSibling: 返回元素之前紧接的节点。
- schemaTypeInfo: 返回与元素相关联的类型信息。
- tagName: 返回元素的名称。
- textContent: 设置或返回元素及其后代的文本内容。
Element 对象的方法
以下是 Element 对象 的一些常用方法:
appendChild(node): 把新的子节点添加到节点的子节点列表末尾。
cloneNode(deep): 克隆节点。deep 参数为 true 时,克隆所有子节点。
compareDocumentPosition(otherNode): 比较两个节点的文档位置。
getAttribute(name): 返回属性的值。
getAttributeNS(namespaceURI, localName): 返回属性的值(带有命名空间)。
getAttributeNode(name): 以 Attribute 对象返回属性节点。
getAttributeNodeNS(namespaceURI, localName): 以 Attribute 对象返回属性节点(带有命名空间)。
getElementsByTagName(tagName): 返回匹配的元素节点及它们的子节点的 NodeList。
getElementsByTagNameNS(namespaceURI, localName): 返回匹配的元素节点(带有命名空间)及它们的子节点的 NodeList。
hasAttribute(name): 返回元素是否拥有匹配指定名称的属性。
hasAttributeNS(namespaceURI, localName): 返回元素是否拥有匹配指定名称和命名空间的属性。
hasAttributes(): 返回元素是否拥有属性。
hasChildNodes(): 返回元素是否拥有子节点。
insertBefore(newNode, referenceNode): 在已有的子节点之前插入一个新的子节点。
isDefaultNamespace(namespaceURI): 返回指定的 namespaceURI 是否为默认。
isEqualNode(otherNode): 检查两个节点是否相等。
isSameNode(otherNode): 检查两个节点是否为同一节点。
isSupported(feature, version): 返回指定的特性是否在此元素上得到支持。
lookupNamespaceURI(prefix): 返回匹配指定前缀的命名空间 URI。
lookupPrefix(namespaceURI): 返回匹配指定命名空间 URI 的前缀。
normalize(): 把节点(包括属性)下的所有文本节点放置到一个“标准”的格式中。
removeAttribute(name): 删除指定的属性。
removeAttributeNS(namespaceURI, localName): 删除指定的属性(带有命名空间)。
removeAttributeNode(oldAttr): 删除指定的属性节点。
removeChild(oldChild): 删除子节点。
replaceChild(newChild, oldChild): 替换子节点。
setAttribute(name, value): 添加新属性。
setAttributeNS(namespaceURI, qualifiedName, value): 添加新属性(带有命名空间)。
setAttributeNode(newAttr): 添加新的属性节点。
setAttributeNodeNS(newAttr): 添加新的属性节点(带有命名空间)。
setIdAttribute(name, isId): 如果 Attribute 对象的 isId 属性为 true,则把指定的属性声明为一个用户确定 ID 的属性。
setIdAttributeNS(namespaceURI, localName, isId): 如果 Attribute 对象的 isId 属性为 true,则把指定的属性声明为一个用户确定 ID 的属性(带有命名空间)。
setIdAttributeNode(idAttr, isId): 如果 Attribute 对象的 isId 属性为 true,则把指定的属性声明为一个用户确定 ID 的属性。
Attr 对象
Attr 对象 表示 Element 对象 的属性。属性的允许值通常定义在 DTD 中。虽然 Attr 对象 也是一种节点,但它不能拥有父节点,也不被认为是元素的子节点。对于许多 Node 属性 来说,都会返回 null。
Attr 对象的属性
- baseURI: 返回属性的绝对基准 URI。
- isId: 如果属性是 ID 类型,则返回 true,否则返回 false。
- localName: 返回属性名称的本地部分。
- name: 返回属性的名称。
- namespaceURI: 返回属性的命名空间 URI。
- nodeName: 返回节点的名称,根据其类型。
- nodeType: 返回节点的类型。
- nodeValue: 设置或返回节点的值,根据其类型。
- ownerDocument: 返回属性所属的根元素(document 对象)。
- ownerElement: 返回属性所附属的元素节点。
- prefix: 设置或返回属性的命名空间前缀。
- schemaTypeInfo: 返回与属性相关联的类型信息。
- specified: 如果属性值被设置在文档中,则返回 true,如果其默认值被设置在 DTD/Schema 中,则返回 false。
- textContent: 设置或返回属性的文本内容。
- value: 设置或返回属性的值。
Text 对象
Text 对象 表示元素或属性的文本内容。
Text 对象的属性
- data: 设置或返回元素或属性的文本。
- isElementContentWhitespace: 判断文本节点是否包含空白字符内容。如果文本节点包含空白字符内容,则返回 true,否则返回 false。
- length: 返回元素或属性的文本长度。
- wholeText: 以文档中的顺序向此节点返回相邻文本节点的所有文本。
Text 对象的方法
- appendData(data): 向节点追加数据。
- deleteData(offset, count): 从节点删除数据。
- insertData(offset, data): 向节点中插入数据。
- replaceData(offset, count, data): 替换节点中的数据。
- replaceWholeText(data): 使用指定文本来替换此节点以及所有相邻的文本节点。
- splitText(offset): 在指定的偏移处将此节点拆分为两个节点,同时返回包含偏移处之后的文本的新节点。
- substringData(offset, count): 从节点提取数据。
CDATASection 对象
CDATASection 对象 表示文档中的 CDATA 区段。CDATA 区段包含了不会被解析器解析的文本。一个 CDATA 区段中的标签不会被视为标记,同时实体也不会被展开。主要的目的是为了包含诸如 XML 片段之类的材料,而无需转义所有的分隔符。
在一个 CDATA 区段中唯一被识别的分隔符是 ]]>,它可标示 CDATA 区段的结束。CDATA 区段不能进行嵌套。
CDATASection 对象的属性
- data: 设置或返回此节点的文本。
- length: 返回 CDATA 区段的长度。
CDATASection 对象的方法
- appendData(data): 向节点追加数据。
- deleteData(offset, count): 从节点删除数据。
- insertData(offset, data): 向节点中插入数据。
- replaceData(offset, count, data): 替换节点中的数据。
- splitText(offset): 把 CDATA 节点分拆为两个节点。
- substringData(offset, count): 从节点提取数据。
实际应用示例
以下是一个使用 XML 文件 books.xml 的示例,展示了如何加载和处理 XML 文档。
加载 XML 文件
function loadXMLDoc(filename) {
var xmlDoc;
if (window.XMLHttpRequest) {
// code for modern browsers
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", filename, false);
xmlhttp.send();
xmlDoc = xmlhttp.responseXML;
} else {
// code for IE5 and IE6
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load(filename);
}
return xmlDoc;
}创建 CDATA 区段节点
function createCDATASection() {
var xmlDoc = loadXMLDoc("books.xml");
var cdata = xmlDoc.createCDATASection("
<book>XML in easy steps</book>");
var book = xmlDoc.getElementsByTagName("book")[0];
book.appendChild(cdata);
document.write(book.textContent);
}处理解析器错误
在处理 XML 文档时,可能会遇到解析器错误。以下是一个示例,展示了如何捕获和显示这些错误。
文件错误
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("nonexistent.xml");
document.write("Error code: " + xmlDoc.parseError.errorCode);
document.write("<br>Error reason: " + xmlDoc.parseError.reason);
document.write("<br>Error line: " + xmlDoc.parseError.line);XML 错误
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.load("malformed.xml");
document.write("Error code: " + xmlDoc.parseError.errorCode);
document.write("<br>Error reason: " + xmlDoc.parseError.reason);
document.write("<br>Error line: " + xmlDoc.parseError.line);总结
通过本文,我们详细介绍了 Element、Attr 和 Text 对象,以及它们的属性和方法。这些知识对于处理 XML 文档至关重要。希望本文能帮助你在 XML 处理中更加得心应手。如果你有任何问题或建议,欢迎在评论区留言!