im_xpath.js
概要
XMLオブジェクトの生成や解析をサポートするメソッドを提供します。
サンプルコード
ImXPathオブジェクトを使用して、XMLドキュメントの作成と
データを取得する例を示します。
<html>
<head>
<script src="csjs/im_xpath.js"></script>
<script language="javascript">
// ■1.次の構造のXMLを作成します
// <root>
// <fruit-list>
// <fruit>りんご</fruit>
// <fruit>みかん</fruit>
// </fruit-list>
// <vegetable-list>
// <vegetable>にんじん</vegetable>
// <vegetable code="001">きゅうり</vegetable>
// </vegetable-list>
// </root>
// XMLドキュメントオブジェクトを生成する
var doc = ImXPath.createXmlDocument();
// ノードの追加
ImXPath.add(doc, "/root/fruit-list/fruit", "りんご");
ImXPath.add(doc, "/root/fruit-list/fruit", "みかん");
ImXPath.add(doc, "/root/vegetable-list/vegetable", "にんじん");
ImXPath.add(doc, "/root/vegetable-list/vegetable/@code", "001");
ImXPath.replace(doc, "/root/vegetable-list/vegetable[@code=001]", "きゅうり");
// ■2.作成されたXMLから値を検索する
// 2.1.ノードオブジェクトで取得する
var sampleNode1 = ImXPath.evaluate(doc, "/root/vegetable-list/vegetable[@code=001]", false, ImXPath.NODE);
alert(sampleNode1.firstChild.nodeValue); // "きゅうり"が表示される
alert(sampleNode1.getAttribute("code")); // "001"が表示される
// 2.2.テキストノードを取得する
var sampleValue2 = ImXPath.evaluate(doc, "/root/vegetable-list/vegetable[@code=001]/text()", false, ImXPath.STRING);
alert(sampleValue2); // "きゅうり"が表示される
// 2.3.ノードの配列を取得する
var sampleNodeArray3 = ImXPath.evaluate(doc, "/root/fruit-list/fruit", true, ImXPath.NODE);
for (var i = 0; i < sampleNodeArray3.length; i++) {
alert(sampleNodeArray3[i].firstChild.nodeValue); // "りんご"、"みかん"の順に表示される
}
// 2.4.属性値の配列を取得する
var sampleAttributeArray4 = ImXPath.evaluate(doc, "/root/vegetable-list/vegetable/@code", true, ImXPath.NUMBER);
for (var i = 0; i < sampleAttributeArray4.length; i++) {
alert(sampleAttributeArray4[i]); // NaN、1 の順に表示される
}
// ■3.ノードの追加と更新をする
// 3.1."vegetable"ノードのcode="001"のテキストノードの値を、"きゅうり"から"なす"に変更します
ImXPath.add(doc, "/root/vegetable-list/vegetable[@code=001]/text()", "なす");
alert(ImXPath.evaluate(doc, "/root/vegetable-list/vegetable[@code=001]/text()", false, ImXPath.STRING)); // "かぼちゃ"が表示される
// 3.2.テキストノードに"キャベツ"を持つ、新しい"vegetable"ノードを追加します
ImXPath.add(doc, "/root/vegetable-list/vegetable", "キャベツ");
// 3.実行結果(docの中身)
// <root>
// <fruit-list>
// <fruit>りんご</fruit>
// <fruit>みかん</fruit>
// </fruit-list>
// <vegetable-list>
// <vegetable>にんじん</vegetable>
// <vegetable code="001">なす</vegetable>
// <vegetable>キャベツ</vegetable>
// </vegetable-list>
// </root>
// ■4.ノードを削除する
// 4.1."fruit-list"ノードを削除します
var rs = ImXPath.remove(doc, "/root/fruit-list");
// 4.実行結果(docの中身)
// <root>
// <vegetable-list>
// <vegetable>にんじん</vegetable>
// <vegetable code="001">なす</vegetable>
// <vegetable>キャベツ</vegetable>
// </vegetable-list>
// </root>
</script>
</head>
<body>
</body>
</html>
Version: 1.0
Author: INTRAMART
クラスの概要
|
ImXPath |
XMLオブジェクトの生成や解析をサポートするメソッドを提供します。 |
function ImXPath(){}
ImXPath.tmpArray;
ImXPath.NODE = 1;
ImXPath.STRING = 2;
ImXPath.NUMBER = 3;
ImXPath.BOOLEAN = 4;
ImXPath.createXmlDocument = function() {
try {
return document.implementation.createDocument("", "", null);
} catch(e) {
}
try {
return new ActiveXObject("Msxml2.DOMDocument.3.0");
} catch(e) {
}
try {
return new ActiveXObject("Microsoft.XMLDOM");
} catch(e) {
}
return null;
}
ImXPath.evaluate = function(doc, path, isArray, type) {
var nodes = ImXPath.getNodesByKey(doc, path, false);
var result;
if (type == undefined || type == ImXPath.NODE) {
result = nodes;
} else {
var lastSyntax = ImXPath.getLastSyntax(path);
result = new Array();
for(var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var val;
if (lastSyntax.attributeKey != undefined) {
val = node.getAttribute(lastSyntax.attributeKey);
} else if (node.nodeType == 3 && lastSyntax.funcKey == "text()") {
val = node.nodeValue;
} else {
val = node;
}
switch (type) {
case ImXPath.STRING:
result.push(val);
break;
case ImXPath.NUMBER:
result.push(parseFloat(val));
break;
case ImXPath.BOOLEAN:
if (val == null || val == undefined) {
result.push(false);
} else if (val.toUpperCase() == "TRUE") {
result.push(true);
} else {
result.push(false);
}
break;
}
}
}
if (isArray == undefined) {
if (result.length == 1) {
return result[0];
} else {
return result;
}
} else if (isArray == true) {
return result;
} else if (isArray == false) {
return result[0];
} else {
return result;
}
}
ImXPath.replace = function(doc, path, value) {
ImXPath.setData(doc, path, value, false);
}
ImXPath.add = function(doc, path, value) {
ImXPath.setData(doc, path, value, true);
}
ImXPath.remove = function(doc, path) {
var nodes = ImXPath.getNodesByKey(doc, path, false);
var lastSyntax = ImXPath.getLastSyntax(path);
var result = false;
try {
for (var i = 0; i < nodes.length; i++) {
if (lastSyntax.attributeKey == undefined) {
nodes[i].parentNode.removeChild(nodes[i]);
result = true;
} else {
nodes[i].removeAttribute(lastSyntax.attributeKey);
result = true;
}
}
} finally {
return result;
}
}
ImXPath.setData = function(doc, path, value, mode) {
var nodes = ImXPath.getNodesByKey(doc, path, true, mode);
var lastSyntax = ImXPath.getLastSyntax(path);
for (var i = 0; i < nodes.length; i++) {
if (lastSyntax.attributeKey == undefined) {
var targetNode;
if (nodes[i].nodeType == 3) {
targetNode = nodes[i].parentNode;
if (nodes[i].nodeValue == "") {
targetNode.removeChild(nodes[i]);
}
} else {
targetNode = nodes[i];
}
if (mode == false) {
while (true) {
var child = targetNode.childNodes[0];
if (child == undefined || child == null) {
break;
}
targetNode.removeChild(child);
}
}
var type = typeof(value);
if (type == "string" || type == "number" || type == "boolean") {
targetNode.appendChild(doc.createTextNode(String(value)));
} else {
targetNode.appendChild(value);
}
} else {
nodes[i].setAttribute(lastSyntax.attributeKey, String(value));
}
}
}
ImXPath.getKeys = function(path) {
var keys = path.split("/");
var lastSyntax = keys[keys.length - 1];
if (keys[0] == "") {
keys.shift();
}
if (lastSyntax.indexOf("@") == 0) {
keys.pop();
}
return keys;
}
ImXPath.getLastSyntax = function(path) {
var keys = path.split("/");
var result = new Object();
var lastSyntax = keys[keys.length -1];
if (lastSyntax.indexOf("@") == 0) {
result.attributeKey = lastSyntax.split("@")[1];
} else {
result.funcKey = lastSyntax;
}
return result;
}
ImXPath.getNodesByKey = function(doc, path, notExistNodeCreate, mode) {
var nodes = doc.childNodes;
ImXPath.tmpArray = new Array();
var arykeys = ImXPath.getKeys(path);
ImXPath.searchNodes(doc, doc.firstChild, nodes, arykeys, 0, notExistNodeCreate, mode);
return ImXPath.tmpArray;
}
ImXPath.searchNodes = function(doc, parentNode, nodes, keys, count, notExistNodeCreate, mode) {
var isTargetExist = false;
var key = String(keys[count]);
count++;
var nodeName;
var predicate;
var attributeKey;
var attributeValue;
var indexValue;
if (key.indexOf("[") != -1 && key.indexOf("]") != -1) {
nodeName = key.split("[")[0];
predicate = key.split("[")[1].split("]")[0];
if (predicate.indexOf("@") == 0 && predicate.indexOf("=") >= 1) {
attributeKey = predicate.split("=")[0].split("@")[1];
attributeValue = predicate.split("=")[1];
} else if (!isNaN(predicate)) {
indexValue = parseInt(predicate);
} else if(predicate == "last()") {
indexValue = nodes.length;
} else {
ImXPath.tmpArray = new Array();
return;
}
} else {
nodeName = key;
}
for(var k = 0; k < nodes.length; k++) {
if (nodeName == "text()" && nodes[k].nodeType == 3) {
ImXPath.tmpArray.push(nodes[k]);
continue;
}
if(nodes[k].tagName == nodeName || "*" == nodeName) {
isTargetExist = true;
if (attributeKey != undefined) {
if (nodes[k].getAttribute(attributeKey) != attributeValue) {
continue;
}
}
if (indexValue != undefined) {
if (indexValue != k + 1) {
continue;
}
}
if (keys.length == count) {
ImXPath.tmpArray.push(nodes[k]);
} else {
ImXPath.searchNodes(doc, nodes[k], nodes[k].childNodes,
keys, count, notExistNodeCreate, mode);
}
}
}
if ((isTargetExist == false && notExistNodeCreate == true) ||
(mode == true && keys.length == count)) {
if (predicate == undefined) {
count--;
ImXPath.tmpArray = new Array();
ImXPath.createNewChildNode(doc, parentNode, keys, count);
}
}
}
ImXPath.createNewChildNode = function(doc, parentNode, keys, count) {
var key = String(keys[count]);
if(key == ""){ return }
var newElement;
if (key == "text()") {
newElement = doc.createTextNode("");
} else {
newElement = doc.createElement(key);
}
if (parentNode == undefined || parentNode == null) {
parentNode = doc;
}
parentNode.appendChild(newElement);
count++;
if (keys.length == count) {
ImXPath.tmpArray.push(newElement);
} else {
ImXPath.createNewChildNode(doc, newElement, keys, count);
}
}
このドキュメントは
JSDoc によって Mon Dec 15 17:12:34 2014に作成されました。