2013-06-08 1 views
3

Я создаю «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 
+0

Рассмотрите возможность создания [SSCCE] (http://sscce.org/), существует много несвязанного кода. А также включите некоторые примеры XML для работы. –

+0

Извините за это, удалил прокомментированный код. Я использую код для HTML, а не XML. – Neernay

+0

Пожалуйста, добавьте XML-вход (или HTML, не имеет значения, в конце); без какого-либо документа для работы над этим невозможно воспроизвести вашу проблему. –

ответ

0

Ну в вашем образце путь /HTML[1]/BODY[1]/DIV[1]/DIV[3]/DIV[1]/DIV[1]/text()[5] выбирает пятый текст дочерний узел div элемента

<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 есть один текстовый дочерний узел, поэтому я не понимаю, почему text()[5] должен выбрать что угодно.

+0

Вы абсолютно правы, но затем возникает другой вопрос относительно XPath: Если в div не содержится слишком много дочерних текстовых сообщений, то почему XPath возвращает дочерний узел больше, чем oNE во время выбора текста из этого " div "... Что вы скажете? – Neernay

+0

Довольно сложно прочитать фрагменты кода, размещенные в комментариях. Я не понимаю, почему ваш код вернет '[5]' при выполнении ''text() [' + (document.evaluate ('previous-sibling :: text()', node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null) .snapshotLength + 1) + ']' 'для образца, который вы отправили, если только содержимое' div' не было создано с помощью DOM API и смежных «текстовых» узлов. В этом случае вам необходимо нормализовать DOM, прежде чем пытаться создать выражения XPath, см. Http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-normalize. –

+0

ok .. перевел код на вопрос. Но это статическая HTML-страница, загруженная в webview. Динамическое создание любого элемента. Попробуй свое предложение. – Neernay