2016-07-28 7 views
0

у меня есть что-то вроде этого:Выберите конкретный узел, который имеет дочерний узел с определенным значением

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Row> 
    <Cell>some value</Cell> 
    <Cell>some value</Cell> 
    ... continues with around 800 other Cells 
    </Row> 
    ...continues with around 2000 other Rows 

ПЕРВАЯ ПРОБЛЕМА: С помощью XPath для выбора данных XML, я хочу, чтобы выбрать строку, которая имеет ячейка с определенным значением. как я могу это достичь? Каков синтаксис xpath для этого?

ВТОРАЯ ПРОБЛЕМА: Моего XML-данные составляют около 1.6х строк коды и выбора данных из него занимает очень много времени, кроме того факта, что он весит около 80 МБ! Как я могу сделать этот процесс более эффективным и повысить производительность? р я использую ниже код для извлечения данных XML:

function loadXMLDoc(dname) 
{ 
    xhttp=new XMLHttpRequest(); 
    xhttp.open("GET", dname ,false); 
    xhttp.send(""); 
    return xhttp; 
} 

var x=loadXMLDoc("data/data.xml"); 
var xml=x.responseXML; 
path="some path"; 
if (document.implementation && document.implementation.createDocument) 
{ 
    var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null); 
    var result=nodes.iterateNext(); 

    while (result) 
    { 
     document.write(result.childNodes[0].nodeValue); 
     document.write("<br>"); 
     result=nodes.iterateNext(); 
    } 
} 
+0

xpath '//Cell[.='some value ']' должен извлекать узлы с ячейками, имеющими текстовое содержимое, как 'some value' – SomeDude

+0

@svasa, но это только выбирает ячейку со значением. Я хочу выбрать своего родителя! Есть ли способ сделать это ? –

+0

Да. '//Cell[.='some value ']/..' даст родительский узел 'Row' – SomeDude

ответ

0

Ответ на первую часть вопроса:

//row[./cell/text() = '3'] 

Применяя это выражение XPath к следующему XML

<root> 
    <row> 
    <cell>1</cell> 
    <cell>2</cell> 
    </row> 
    <row> 
    <cell>3</cell> 
    <cell>4</cell> 
    </row> 
</root> 

производит следующие данные:

> xmllint -xpath "//row[./cell/text() = '3']" test.xml 
<row> 
    <cell>3</cell> 
    <cell>4</cell> 
</row> 

Что касается второй части вашего вопроса, проблема в том, что создание полного DOM для такого большого документа довольно дорого. Таким образом, вам нужно изучить синтаксический анализ событий (SAX, см. https://en.wikipedia.org/wiki/Simple_API_for_XML), но у меня нет личного опыта с этим.

+0

Спасибо! Кстати, как вы думаете, XPath - лучший способ получить данные XML из javascript? –

+0

@MehdiJorJor Извините, у меня мало опыта работы с Javascript. – Markus

Смежные вопросы