方案

2010-10-26 43 views
2

使用成員函數這是我的代碼:方案

(define p (read(open-input-file "starbucks4.sxml"))) 

(define get-artifacts 
    (lambda (l) 
    (member (list 'opm:artifact) l))) 



    (get-artifacts p) 

我被告知,該成員函數在整個名單完全搜索。 .sxml文檔中有一個複雜的列表,其中包含許多稱爲「opm:artifact」的元素,但此方法返回#f且不包含列表。

任何人都可以看到我做錯了什麼?

樣品.sxml文件:

 (opm:account ((ref "detailedAccount"))) 
    "\n   " 
    (opm:label ((value "Provide other Beverage"))) 
    "\n  ") 
    "\n ") 
"\n " 
(opm:artifacts 
() 
    "\n  " 
    (opm:artifact 
    ((id "a1")) 
    "\n   " 
    (opm:account ((ref "detailedAccount"))) 
    "\n   " 
    (opm:label ((value "order"))) 
    "\n  ") 
    "\n  " 
    (opm:artifact 
    ((id "a2")) 
    "\n   " 
    (opm:account ((ref "detailedAccount"))) 
    "\n   " 
    (opm:label ((value "cash"))) 
    "\n  ") 
    "\n  " 

我試圖尋找所有的OPM:文物和相關的數據(它的子表)。

回答

2

它會搜索整個列表,但它不會搜索子列表。

因此,如果您的列表實際上是一個嵌套列表,並且(opm:artifact)只在其中一個子列表中,member將無法​​找到它。

另請注意,您正在尋找名單(opm:artifact),而不是代碼opm:artifact或任何包含opm:artifact的列表。

編輯:要搜索的子列表,你可以做這樣的事情:

(define (deep-search x lst) 
    (if (empty? lst) 
    #f 
    (if (equal? x (car lst)) 
     #t 
     (begin 
     (if (list? (car lst)) 
      (let ((r (deep-search x (car lst)))) 
       (if r 
       r 
       (deep-search x (cdr lst)))) 
      (deep-search x (cdr lst))))))) 
+0

謝謝!我會如何搜索符號opm:神器? – Alex 2010-10-26 19:34:18

+1

@Alex:'(deep-search'opm-artifact p)'注意這隻會返回true或false。如果你需要更多,需要修改一下。 – sepp2k 2010-10-26 19:43:08

+1

@Alex:另外請注意,對於示例文件,您顯示'p'將只包含'(opm:account((ref'detailedAccount「))),因爲'read'只讀取一個表單。 – sepp2k 2010-10-26 19:44:34

0

我注意到的第一件事是,你是給作爲第一個參數member一個元素的列表。會員是這樣的:

>>> (member 2 '(4 5 2 6 7)) 
(2 6 7) 

你能不能給我們帶來什麼p看起來像一個樣品,你想要什麼結果?

+1

謝謝!我用一些p樣本編輯了我的原始問題。 – Alex 2010-10-26 19:40:21

0

等一下,我可以讓你的生活變得更輕鬆。根據你的「starbucks.sxml」文件名,看起來你已經在使用sxml racket包了。如果是這樣,那麼你也可以使用該庫的「sxpath」的一部分,徹底簡化您的代碼:

#lang racket 

(require (planet lizorkin/sxml:2:1/sxpath)) 

(define tree (file->value "/tmp/starbucks.sxml")) 

(define artifact-filter (sxpath '(opm:artifact))) 

(artifact-filter tree) 

這將返回OPM的列表:神器節點(包括內他們的一切)。舉例來說,當我跑在它上面你提供的片段(再加上一堆插開括號的 - 他們是不均衡的 - 我得到這個:

Welcome to DrRacket, version 5.0.2.1--2010-10-27(41c084c/g) [3m]. 
Language: racket; memory limit: 512 MB. 
'((opm:artifact 
    ((id "a1")) 
    "\n   " 
    (opm:account ((ref "detailedAccount"))) 
    "\n   " 
    (opm:label ((value "order"))) 
    "\n  ") 
    (opm:artifact 
    ((id "a2")) 
    "\n   " 
    (opm:account ((ref "detailedAccount"))) 
    "\n   " 
    (opm:label ((value "cash"))) 
    "\n  ")) 

整個sxml包的文檔真的很糟糕......也許「不存在」會是一個更好的詞;但公平地說,sxml人有興趣支持所有方案,而不僅僅是Racket,所以他們當然可以被原諒,因爲他們不會花費大量時間編寫文檔球拍格式,Scribble