方案

2010-10-26 51 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