XML DOM Element 对象详解(五)

在处理 XML 文档时,了解 DOM(Document Object Model)的基本对象和方法是非常重要的。本文将详细介绍 ElementAttrText 对象,帮助你在 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);

总结

通过本文,我们详细介绍了 ElementAttrText 对象,以及它们的属性和方法。这些知识对于处理 XML 文档至关重要。希望本文能帮助你在 XML 处理中更加得心应手。如果你有任何问题或建议,欢迎在评论区留言!