Я создаю «Highlighter» для Android в WebView. Я получаю выражение XPath для выбранного диапазона в HTML с помощью функции следующим образомdocument.evaluate не возвращает правильные текстовые поля XPath
/HTML [1]/BODY [1]/DIV [1]/DIV [3]/DIV [1]/DIV [1]/текст() [5]
Теперь я оценка выше выражение XPath через эту функцию в JavaScript
var resNode = document.evaluate('/HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[5]',document,null,XPathResult.FIRST_ORDERED_NODE_TYPE ,null);
var startNode = resNode.singleNodeValue;
но я набираюсь startNode 'нулевым'.
Но вот интересный момент:
если оценить этот «/ HTML [1]/BODY [1]/DIV [1]/DIV [3]/DIV [1]/DIV [ 1] ' выражение XPath с использованием той же функции, оно дает правильный узел, т. Е.' Div '.
Разница между двумя XPaths - это предыдущие, содержащие textNode, а затем только div.
Но то же самое работает на настольных браузерах.
Edited Образец HTML
<html>
<head>
<script></script>
</head>
<body>
<div id="mainpage" class="highlighter-context">
<div> Some text here also....... </div>
<div> Some text here also.........</div>
<div>
<h1 class="heading"></h1>
<div class="left_side">
<ol></ol>
<h1></h1>
<div class="text_bio">
In human beings, height, colour of eyes, complexion, chin, etc. are
some recognisable features. A feature that can be recognised is known as
character or trait. Human beings reproduce through sexual reproduction. In this
process, two individuals one male and another female are involved. Male produces
male gamete or sperm and female produces female gamete or ovum. These gametes fuse
to form zygote which develops into a new young one which resembles to their parent.
During the process of sexual reproduction
</div>
</div>
<div class="righ_side">
Some text here also.........
</div>
<div class="clr">
Some text here also.......
</div>
</div>
</div>
</body>
</html>
получение XPath:
var selection = window.getSelection();
var range = selection.getRangeAt(0);
var xpJson = '{startXPath :"'+makeXPath(range.startContainer)+
'",startOffset:"'+range.startOffset+
'",endXPath:"'+makeXPath(range.endContainer)+
'",endOffset:"'+range.endOffset+'"}';
функция сделать XPath:
function makeXPath(node, currentPath) {
currentPath = currentPath || '';
switch (node.nodeType) {
case 3:
case 4:return makeXPath(node.parentNode, 'text()[' + (document.evaluate('preceding-sibling::text()', node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']');
case 1:return makeXPath(node.parentNode, node.nodeName + '[' + (document.evaluate('preceding-sibling::' + node.nodeName, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength + 1) + ']' + (currentPath ? '/' + currentPath : ''));
case 9:return '/' + currentPath;default:return '';
}
}
Я не работаю с XML, но с HTML в webview.
Я пытался использовать сериализацию и десериализацию Rangy, но Rangy «Serialize» работает правильно, но не «десериализуется».
Любые идеи, ребята, что не так?
UPDATE
Наконец получил основную причину проблемы (а не решение пока :()
`, что именно происходит в андроида WebView -. >> Каким-то образом, андроид WebView является изменение структуры DOM загруженной HTML-страницы. Несмотря на то, что DIV не содержит каких-либо TEXTNODES, при выборе текста из DIV, я получаю TEXTNODE для каждой отдельной строки в этом DIV.например, для того же HTML-страницы в браузере рабочего стола и для того же выделенного текста, то XPath получают из WebView совершенно отличается от заданного в браузере настольного компьютера "
XPath from Desktop Browser:
startXPath /HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[1]
startOffset: 184
endXPath: /HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[1]
endOffset: 342
Xpath from webview:
startXPath :/HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[3]
startOffset:0
endXPath:/HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[4]
endOffset:151
Рассмотрите возможность создания [SSCCE] (http://sscce.org/), существует много несвязанного кода. А также включите некоторые примеры XML для работы. –
Извините за это, удалил прокомментированный код. Я использую код для HTML, а не XML. – Neernay
Пожалуйста, добавьте XML-вход (или HTML, не имеет значения, в конце); без какого-либо документа для работы над этим невозможно воспроизвести вашу проблему. –