суббота, 15 августа 2009 г.

Iconv JavaScript

function win2unicode (str){
if (str == null){ return null;}
var result = "";
var o_code = "";
var i_code = "";
for (var I=0; I < str.length; I++){
i_code = str.charCodeAt(I);
if (i_code == 184){
o_code = 1105;
} else
if (i_code == 168){
o_code = 1025;
} else
if (i_code > 191 && i_code < 256){
o_code = i_code + 848; }
else {
o_code = i_code;
}
result = result + String.fromCharCode(o_code);
}


var koi2utf={
163:1105,
179:1025,
192:1102,
193:1072,
194:1073,
195:1094,
196:1076,
197:1077,
198:1092,
199:1075,
200:1093,
201:1080,
202:1081,
203:1082,
204:1083,
205:1084,
206:1085,
207:1086,
208:1087,
209:1103,
210:1088,
211:1089,
212:1090,
213:1091,
214:1078,
215:1074,
216:1100,
217:1099,
218:1079,
219:1096,
220:1101,
221:1097,
222:1095,
223:1098
};

function koi2unicode (str){
if (str == null){ return null;}
var result = "";
var o_code = "";
var i_code = "";
for (var I=0; I < str.length; I++){
i_code = str.charCodeAt(I);
if (koi2utf[i_code] != null){
o_code = koi2utf[i_code];
} else
if (i_code > 223 && koi2utf[i_code-32] != null)
{
o_code = koi2utf[i_code-32]-32;

} else {
o_code = i_code;
}
result = result + String.fromCharCode(o_code);
}

return result;
}



return result;
}

четверг, 13 августа 2009 г.

XPathResult документация FireFox

Реализация XPath в Firefox следует общим стандартам DOM и целиком отличается от реализации XPath в IE. Реализация в Firefox позволяет выполнять выражения XPath как в документах XML, так и в документах HTML. В основе реализации находятся два первичных объекта: XPathEvaluator и XPathResult.

Класс XPathEvaluator вычисляет заданное выражение XPath с помощью метода evaluate(), который принимает пять аргументов: строку с выражением XPath, контекстный узел, к которому должно быть применено выражение, интерпретатор пространств имен (функцию, которая будет обрабатывать пространства имен в выражении), тип результата (существует десять различных типов результата) и объект XPathResult, в который будут помещаться результаты выборки (если в этом аргументе передается значение null, будет создан и возвращен новый объект XPathResult).

Прежде чем двинуться дальше, необходимо разобраться с различными типами результата, которые могут возвращаться методом evaluate(). Список их приводится ниже:

XPathResult. ANY_TYPE не какой-то конкретизированный тип, какой угодно тип. Метод возвращает тип, который естественным образом вытекает из вычисления выражения.
XPathResult.ANY_UNORDERED_NODE_TYPE возвращает набор узлов, состоящий из единственного узла, к которому можно обратиться через свойство singleNodeValue. В случае если требуемый узел не будет найден, возвращается значение null. Возвращаемый узел может быть, а может не быть первым узлом в документе, соответствующим заданному критерию отбора.
XPathResult. BOOLEAN_TYPE возвращает логическое значение.
XPathResult. FIRST_ORDERED_NODE_TYPE возвращает набор узлов, состоящий из единственного узла, к которому можно обратиться через свойство singleNodeValue класса XPathResult. Возвращаемый узел обязательно будет первым узлом в документе, соответствующим заданному критерию отбора.
XPathResult. NUMBER_TYPE возвращает числовое значение.
XPathResult. ORDERED_NODE_ITERATOR_TYPE возвращает упорядоченный (в порядке следования в документе) набор узлов, который можно последовательно обойти с помощью метода (итератора) iterateNext (). Этот метод позволяет обратиться к любому узлу в наборе.
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE возвращает упорядоченный (в порядке следования в документе) статический набор узлов. Модификации узлов, выполняемые в документе, не оказывают влияния на результат.
XPathResult. STRING_TYPE возвращает текстовую строку.
XPathResult.UNORDERED_NODE_ITERATOR_TYPE -возвращает неупорядоченный набор узлов, обойти который можно с помощью уже упоминавшегося метода iterateNext(). Однако порядок следования узлов в наборе может совпадать, а может не совпадать с порядком следования узлов в документе.
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE возвращает неупорядоченный статический набор узлов. Модификации узлов, выполняемые в документе, не оказывают влияния на результат.
Чаще всего используется тип XPathResult. ORDERED_NODE_ITERATOR_TYPE:

var oEvaluator = new XPathEvaluatorO;
var sXPath = "book/author";
var oResult = oEvaluator.evaluateCsXPath.oXmlDorc.documentElement,null, XPathResult.OROERED_NODE_ITERATOR_TYPE, null);
var aNodes = new Array;
if (oResult != null) { var oElement;
while (oElement = oResult. iterateNextO) { aNodes.push(oElement);
}

Этот фрагмент кода создает и вычисляет выражение XPath book/author в контексте корневого элемента документа. Поскольку запрошен результат типа ORDERED_NODE_ITERATOR_TYPE, в качестве результата возвращается набор узлов, обойти который можно посредством метода iterateNextO. По своему действию метод iterateNextO напоминает свойство nextSibling узла DOM в том смысле, что он выбирает следующий узел из результирующего набора и возвращает значение null по достижении конца набора. Эта функция может быть использована в цикле while, как в предыдущем примере, где цикл продолжает работу до тех пор, пока в oElement не появится пустая ссылка, и добавляет очередной узел в массив aNodes с помощью метода push О. Заполненный массив может использоваться, как в IE, что позволяет получать доступ к элементам массива в цикле for.

Мой Пример:

s='/html/body/div/div[3]/div[2]/div/div/div[4]/div/div['+i.toString()+']/table/tbody/tr/td[2]/div/dl/dd/div/a';
headings = document.evaluate(s, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null);
//возвращает колличество полученных элементов.
alert(headings.snapshotLength.toString());
//возвращает ссылку [a.href]
userhref=headings.snapshotItem(0).toString();
//возвращает контент snapshotItem(0) -го элемента из возвращенных.
alert(headings.snapshotItem(0).textContent);

//Колличество ссылок в документе:

var linkCount = document.evaluate('count(//a[@href])',
document, null, XPathResult.NUMBER_TYPE, null
).getNumberValue();