2016-07-28 14 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 

最初の問題: XMLデータを選択するために、XPathを使用することでは、私が持っている行を選択したいです特定の値を持つセル。どうすればこれを達成できますか?このためのxpath構文は何ですか?

第二の問題: 私のXMLデータは、コードの行1.6メートル程度であると、そこからデータを選択することはさておき80Mbs周りが重みをその事実から、非常に長い時間がかかります!このプロセスをより効果的にし、パフォーマンスを向上させるにはどうすればよいですか?私は、XMLデータを取得するために以下のコードを使用し PN:あなたの質問の最初の部分に

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 ']'はテキストコンテンツがある値のセルを持つノードを取得する必要があります – SomeDude

+0

@svasaしかし、これは値を持つセルのみを選択します。私はその親を選択したい!これを行う方法はありますか? –

+0

はい。 '//Cell[.='some value ']/..'は親ノード 'Row'を与えます – SomeDude

答えて

0

回答:

次のXML

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

に、このXPath式を適用する

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

次の出力を生成します。

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

質問の第2の部分については、問題は、そのような大きなドキュメントの完全なDOMを構築することは非常に高価であるということです。したがって、イベント駆動型の解析(SAX、https://en.wikipedia.org/wiki/Simple_API_for_XMLを参照)を調べる必要がありますが、私はそれに個人的な経験はありません。

+0

ありがとう!ところで、あなたはXPathが私がjavascriptからXMLデータを取得できる最良の方法だと思いますか? –

+0

@MehdiJorJor申し訳ありませんが、私はJavascriptで多くの経験がありません。 – Markus

関連する問題