2016-07-28 123 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.6M碼和選擇數據線從它需要很長的時間,除了一個事實,即它重約80Mbs!我怎樣才能使這個過程更有效,提高性能? PN我用下面的代碼來檢索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']/..'會給父節點'行' – 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是我可以從JavaScript檢索XML數據的最佳方式嗎? –

+0

@MehdiJorJor對不起,我沒有太多的Javascript經驗。 – Markus