2014-09-30 24 views
1

假設我需要根據多個標準(書的標題,書的主題,書的作者,書的價格...)選擇節點列表,每個標準可能涉及選擇多個值中的任何一個(主題是一個作者是Bob,Ted,Carol,Alice之一)XPath可以重複使用,縮小結果嗎?

生成的XPath查詢可能非常長,而且語法相當複雜。而不是一次執行查詢,是否可以執行初始查詢(例如,僅考慮主題),生成節點列表,然後應用第二個XPath查詢,以將該節點列表縮短爲較短清單?

在我看來,答案是否定的,因爲selectNodes方法不能應用於IXMLDOMNodeList對象,初始結果將是。我錯過了什麼嗎?有沒有辦法做到這一點?

[問題的上下文是:向用戶呈現表單,爲報表生成器選擇標準。用戶可以選擇一個或多個標準,並具有不同程度的細節。 將所有選擇的標準組合成一個XPath查詢變得相當繁瑣,特別是因爲不同標準發生在樹的不同級別。]

如果可能,迭代應用標準將大大降低複雜性。

+0

的XPath在VBA或任何其他語言只是純字符串。你可以隨時迭代地建立一個字符串 – har07 2014-09-30 04:08:43

+0

謝謝,但這不是我所要求的。我的意思是可以建立一個代表第一個標準的字符串,得到結果,然後使用第二個XPath字符串將結果進一步減少到一個更小的集合。我的問題是您是否可以使用XPath來限制現有的NodeList。 – Selecter 2014-09-30 05:39:02

回答

0

可以將XPath查詢應用於單個IXMLDOMNode以獲取使用該節點作爲起點的新節點列表,但正如您發現的那樣,不能將XPath直接應用於IXMLNDOMNodeList。解決此

一種方法是:

  1. 執行的XPath查詢
  2. 應用下的XPath步驟每個結果
  3. 將所有步驟2的結果的爲一組(確保淘汰重複)
  4. 從第2步

但是繼續,這可能變成是非常inefficie NT。

我想har07建議使用字符串來構建XPath是一個非常好的選擇。沒有理由必須比你想要做的更復雜。您可以簡單地一步一步,併爲每個過濾器使用單獨的謂詞。

開始與你的主路徑(在這裏使用僞代碼,而不是實際的VBA):

string path = "/my/node/path" 

然後通過一個過濾器添加到一個:

if (filtering by author) { 
    path += "[author = 'Bob' or author = 'Ted']" // <- build this up dynamically 
} 
if (filtering by subject) { 
    path += "[subject = 'Thailand' or subject = 'Finance']" 
} 

IXMLDOMNodeList nodes = document.selectNodes(path) 
+0

但是,與往常一樣,當使用字符串連接創建可執行代碼時,請注意代碼注入攻擊。不要在構造的表達式中包含不受信任的字符串,而應使用變量,假設您的XPath API允許它們。 – 2014-09-30 07:37:39

+0

謝謝大家的幫助和意見。部分問題是完整的XPath字符串在一次傳遞中完成此操作會導致字符太多,並且似乎會被截斷。我不知道XPath字符串的最大字符數限制,但我相信我的應用程序已超過它。如果我嘗試在部分字符串,它的作品。如果我嘗試使用較少選擇的字符串(即「主題」只有2個可接受的條目而不是20個),它就可以工作。 – Selecter 2014-10-24 01:21:16