Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 删除lisp程序中的标记_Xml_Tags_Lisp - Fatal编程技术网

Xml 删除lisp程序中的标记

Xml 删除lisp程序中的标记,xml,tags,lisp,Xml,Tags,Lisp,我需要一些编程方面的帮助。我正在用CommonLisp编写代码,并试图从字符串列表中删除标记。我读取XML格式的文件,我的目标是删除出现在之间的任何文本,如果标记以?XML开头,则需要删除整行。我知道命令行中有/函数可供使用,但我正试图在实际的Lisp代码中删除这些函数,但我不知道如何执行。每次我尝试都会出错 现在,这里是我在文件中读取的代码(它可以工作): ;;;程序:Lisp作业1 ;;;作者:鼠标 (定义文件行(文件) ;;;返回字符串列表和 读台词。 (具有打开的文件(i文件) (行的循

我需要一些编程方面的帮助。我正在用CommonLisp编写代码,并试图从字符串列表中删除标记。我读取XML格式的文件,我的目标是删除出现在
之间的任何文本,如果标记以
?XML
开头,则需要删除整行。我知道命令行中有/函数可供使用,但我正试图在实际的Lisp代码中删除这些函数,但我不知道如何执行。每次我尝试都会出错

现在,这里是我在文件中读取的代码(它可以工作):

;;;程序:Lisp作业1
;;;作者:鼠标
(定义文件行(文件)
;;;返回字符串列表和
读台词。
(具有打开的文件(i文件)
(行的循环=(读取行i nil nil)
和从0开始的行计数
边线
将行收集成行
最后(返回(值行数(()())))

我的想法是,在写着
的那一行之后,我必须输入代码来检查标签,但我不知道该用什么。每次调用
remove
delete
方法时,我都会得到一个错误。我不知道我是不是给他们打错电话了。有人能帮忙吗?

我想你的问题不是很清楚。为什么要从字符串列表中删除标记,而示例代码从文件中读取行?假设您确实在询问字符串列表,那么标记是否可以分布在这些字符串的多个上?此外,您询问有关
删除
删除
的问题时,并未提及您真正尝试过的内容以及失败的原因。如果您想直接更改文件的内容,那么,您不能仅仅从流中删除内容,然后期望它能够工作

下面是一种通过逐个字符读取流来删除标记的简单方法:

(defun remove-tags (string)
  (flet ((read-tag (instream)
           (loop for char = (read-char instream nil nil)
                 while (not (string= char #\>)))))
    (with-output-to-string (outstream)
      (with-input-from-string (instream string)
        (loop for char = (read-char instream nil nil)
              while char
              if (char= char #\<) do (read-tag instream)
              else do (write-char char outstream))))))


CL-USER> (remove-tags "<p><a href=\"foo\">bar</a> frob <emph>baz</emph> quux</p>")
"bar frob baz quux"
(如果我没记错的话,XML字符串中允许使用未缩放的结束尖括号。)

此外,这在速度方面既没有经过测试,也没有经过优化——按字符处理的速度可能太慢,而且它无法处理
?xml
标记的删除。所有这些都留给读者作为练习


出于实际目的,您可能只需要使用其中一个XML库,或者使用regexen和pray。解析和处理XML是一个在实际使用中几乎任何语言的许多库中都已解决的问题,并且有许多细节可能出错(如果您真的只想删除一些标记,可能不是这样,但可能是obsta),无论如何,这是一个相当无聊的练习。

我认为你的问题不是很清楚。为什么要从字符串列表中删除标记,而示例代码从文件中读取行?假设您确实在询问字符串列表,那么标记是否可以分布在这些字符串的多个上?此外,您询问有关
删除
删除
的问题时,并未提及您真正尝试过的内容以及失败的原因。如果您想直接更改文件的内容,那么,您不能仅仅从流中删除内容,然后期望它能够工作

下面是一种通过逐个字符读取流来删除标记的简单方法:

(defun remove-tags (string)
  (flet ((read-tag (instream)
           (loop for char = (read-char instream nil nil)
                 while (not (string= char #\>)))))
    (with-output-to-string (outstream)
      (with-input-from-string (instream string)
        (loop for char = (read-char instream nil nil)
              while char
              if (char= char #\<) do (read-tag instream)
              else do (write-char char outstream))))))


CL-USER> (remove-tags "<p><a href=\"foo\">bar</a> frob <emph>baz</emph> quux</p>")
"bar frob baz quux"
(如果我没记错的话,XML字符串中允许使用未缩放的结束尖括号。)

此外,这在速度方面既没有经过测试,也没有经过优化——按字符处理的速度可能太慢,而且它无法处理
?xml
标记的删除。所有这些都留给读者作为练习

出于实际目的,您可能只需要使用其中一个XML库,或者使用regexen和pray。解析和处理XML是一个在实际使用中几乎任何语言的许多库中都已解决的问题,而且有很多细节可能出错(如果您真的只是想删除一些标记,可能不是这样,但这是一个很无聊的练习)