2015-05-04 58 views
0

我在JS所分析的XML字符串,數據來自維基百科的API,看起來像這樣:排除子元素不起作用

<part> 
    <name> 
     Other names 
    </name>= 
    <value> * Some * other * Names ([[IUPAC]]) 
     <ext> 
      <name> 
       ref 
      </name> 
      <attr/> 
      <inner> 
       {{SomePaper|3283|Datum=20. November 2014}} 
      </inner> 
      <close> 
       &lt;/ref&gt; 
      </close> 
     </ext> 
     * Last name 
    </value> 
</part> 

我想使用XPath只是提取所有名稱=沒有子節點<value>。我分析有

var doc = new DOMParser().parseFromString(xmlString,'text/xml'); 

,然後將XML嘗試

var result = doc.evaluate("//name[contains(text(), 'Other names')]/following-sibling::value[not(self::ext)]", doc, null, XPathResult.STRING_TYPE, null); 

提取然而,輸出是一樣的東西* Some * other * Names ([[IUPAC]])ref{{SomePaper|3283|Datum=20. November 2014}}</ref> * Last name

一兩件事,這類作品是

var result = doc.evaluate("//name[contains(text(), 'Other names')]/following-sibling::value[not(self::ext)]/text.()", doc, null, XPathResult.STRING_TYPE, null); 

但是,我放棄了</ext>之後的所有內容=「*姓氏」丟失(原因解釋here我認爲)。

我在這裏做錯了什麼?

更新

這裏有一個小提琴:http://jsfiddle.net/v03xqoq4/1/

我想要的輸出:

*某些*等*名稱([IUPAC]])*姓

+2

你想輸出什麼?請_顯示它。 –

+1

好吧,這個位顯然是無稽之談:'following-sibling :: value [not(self :: ext)]',因爲名爲'value'的元素永遠不會滿足謂詞'self :: ext'。 –

+0

感謝您的建議Mathias,更新了我的問題(也是一個小提琴)。 Fair point @MichaelKay,感謝您的幫助。但我仍然沒有線索如何解決我的問題:(。 – user3255061

回答

0

這是我如何得到它的工作:

var iterator = doc.evaluate("//name[contains(text(), 'Andere Namen')]/following-sibling::value[1]/text()", doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 

try { 
    var thisNode = iterator.iterateNext(); 

    while (thisNode) { 
    console.log(thisNode.textContent); 
    thisNode = iterator.iterateNext(); 
    } 
} 

小提琴:http://jsfiddle.net/ryv72mqm/2/

謝謝@Mathias穆勒讓我有!

0

如果您真正想要的是零件名稱,並且沒有來自價值標籤內的數據(「沒有價值的子節點。「),只需使用/part/name[contains(text(), 'Other names')]

如果這不是你想要的,請解釋一下你希望看到的輸出什麼下面

編輯基於評論:

OK,我想你剛。在你的XPath字符串的加時賽

嘗試//name[contains(text(), 'Other names')]/following-sibling::value[not(self)]/text()

+0

非常感謝您的幫助@DataMasseur,也提示描述我所需的輸出。我更新了我的問題。您的解決方案雖然沒有返回任何內容(http: //jsfiddle.net/861yw8xc/),還是我做錯了什麼?我是一個在xPath中的新手:不是「*姓氏」位連接到''-tag? – user3255061

+0

好吧,看着你的小提琴,你添加了一個父模板標籤,這就是爲什麼我的答案沒有返回任何東西。我認爲解決方案的一部分是最高級別。爲了清楚起見,你需要任何不會出現在「值」標籤? –

+0

另一方面,你的小提琴中的XML是無效的,因爲關閉的模板標籤格式不正確 –

1

也許下面的表達式是你所需要的:

//name[contains(text(), 'Other names')]/following-sibling::value[1]/text() 

施加到你顯示輸入XML,結果是(由-------分離的單獨的結果):

* Some * other * Names ([[IUPAC]]) 
----------------------- 
* Last name 

正如你可以看到,表達式返回兩個單獨的結果,而要產生是串聯的字符串,這是XPath 1.0所不能做到的。但我想你可以使用JS字符串函數來連接結果。

現在,一些可能會有所幫助的詳細信息。讓我們看看你的XML輸入:

<part> 
    <name> 
     Other names 
    </name>= 
    <value> * Some * other * Names ([[IUPAC]]) 
     <ext> 
      <!--Irrelevant stuff--> 
     </ext> 
     * Last name 
    </value> 
</part> 

你感興趣的部分是孩子文本節點value元素。在XPath中,文本節點用text()標識(與*標識元素節點的方式相同)。你可以通過簡單地評估

//value/text() 

讓他們,但你的問題暗示,有可能是幾個value元素和選擇具有與該value元素先於name元素做。


最後,您的小提琴可能有問題。即使doc.evaluate("//*", doc, null, XPathResult.STRING_TYPE, null)也不會返回任何內容。

+0

非常感謝Mathias的幫助,並詳細解釋了它。仍然我不明白「正如你所看到的,表達式返回兩個單獨的結果」。我讀了更多關於它(http://stackoverflow.com/questions/7550652/multiple-string-results-for-an-xpath),看起來像XPath 1.0不能返回兩個結果。我理解我將如何連接兩個結果,但是如何獲得第二個結果?更新小提琴(感謝Data Masseur的提示),謝謝你的支持。 – user3255061

+2

@ user3255061 XPath 1.0當然可以選擇多個結果,但不能__結果字符串,這就是Dimitre的答案。如果你沒有得到兩個結果,你a)要麼沒有使用正確的JS函數來選擇多個節點,要麼b)你沒有將它們存儲在一個適當的數據結構中,它可以容納多個項目或c)你擁有所有的以上正確,但只輸出第一個結果或d)您的輸入文檔實際上是不同的。 –