2011-07-20 39 views
2

我需要創建一個XML xPath解析器。所有解析都必須在客戶端發生(使用javascript)。我創建了一個可以做到這一點的JavaScript,並且一切都很順利,直到默認命名空間開始發揮作用。我根本無法查詢具有默認命名空間的XML。在javascript中使用xPath解析XML並使用默認命名空間

我在小提琴上創建了一個示例代碼。 xmlString是從服務器接收到的XML字符串。在xPathString中是對收到的XML進行查詢。

這裏是一些假設:

  1. http://jsfiddle.net/BF34q/1/ - 沒有命名空間 - 一切正常OK
  2. http://jsfiddle.net/BF34q/2/ - NS添加了命名空間。元素有ns:前綴。 xPath使用此前綴 - 確定
  3. http://jsfiddle.net/BF34q/3/ - 使用的默認名稱空間 - 不確定如何配置xPathString。

注意,別人會用這個解析器,所以我真的想避免解決方案,如

var xPathString = "//*[local-name()='book']"; 

,讓他們使用簡單的XPath表達式解析它。我想知道是否有可能在JavaScript中分配默認命名空間前綴?

注意:在提琴上提供的示例在IE中不起作用。

回答

7

我認爲有三種方法可以做到這一點:

  1. 使用//*[local-name()='book']語法來訪問節點
  2. Convert XML to string,刪除默認命名空間使用正則表達式,convert it back to XML
  3. 對於您事先知道命名空間的XML文件,您可以創建own namespace resolver,這將允許您將自己的前綴用於默認命名空間。

這是可以實現這樣的:

function nsResolver(prefix) { 
    switch (prefix) { 
     case 'xhtml': 
      return 'http://www.w3.org/1999/xhtml'; 
     case 'mathml': 
      return 'http://www.w3.org/1998/Math/MathML'; 
     default: 
      return 'http://example.com/domain'; 
    } 
} 
xml.evaluate('//myPrefix:book', xml, nsResolver, XPathResult.ANY_TYPE, null); 
0

我的印象是,您對XPath處理的理解與實現不匹配 - 除非您正在處理的實現與我熟悉的實現非常不同。

通常,XPath處理器必須註冊名稱空間並將映射到它們的前綴爲了成功評估表達式。所以前綴可以是任何東西 - 唯一重要的是他們映射到的東西。請參閱this answer by a known expert以獲取更多信息。

+0

可以省略前綴命名空間,然後該命名空間被認爲是默認的命名空間。以下是一些示例和說明:http://www.w3schools.com/xml/xml_namespaces.asp,http://www.developerfusion.com/article/3720/understanding-xml-namespaces/5/ – dugokontov

+0

@dugokontov,I認爲你很困惑**沒有命名空間**和**默認命名空間**。在XML文檔中,您使用'xmlns =「something」'設置默認名稱空間,所以沒有前綴。默認情況下,默認名稱空間**是空白名稱空間(無名稱空間)。默認名稱空間取決於上下文; XPath在這裏不會例外。通過不指定任何帶有XPath表達式的前綴並且不註冊任何名稱空間,OP的表達式很可能與沒有名稱空間的節點相匹配。 – Lumi

+0

你只是傷了我在我的評論中所做的一樣:_在XML文檔中,使用xmlns =「something」設置默認名稱空間,所以沒有prefix_ == _您可以省略名稱空間的前綴,然後該名稱空間被視爲默認namespace_。另外,你的最後一句中的場景在我提供的第一個例子中描述:http://jsfiddle.net/BF34q/1/。所以,我有點困惑,你想對我說什麼? – dugokontov

相關問題