2016-08-16 3 views
0

У меня есть код, который анализирует данные мыла с помощью молнии. Когда я отформатирую его так, как будто он работает так, как ожидается, для меняИспользование xml-> in a let

(defn parse-data 
[raw-data] 
(let [soap-data (:body raw-data) 
     soap-envelope (zip/xml-zip 
        (xml/parse 
         (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8"))))] 
     (pprint (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :Tag1 :Tag2)))) 

Он печатает ожидаемый результат. Но когда я двигаю XML парсинг в Выпускаемом заявлении он не компилируется, со следующей ошибкой (я проверил мою тройную скобка совпадает)

RuntimeException EOF while reading, starting at line 3 clojure.lang.Util.runtimeException (Util.java:221) 
jcode.oc-drift.aquisition=>  (pprint result-data))) 

CompilerException java.lang.RuntimeException: Unable to resolve symbol: result-data in this context, compiling:(/tmp/form-init6714472131112461091.clj:1:1) 
RuntimeException Unmatched delimiter:) clojure.lang.Util.runtimeException (Util.java:221) 

RuntimeException Unmatched delimiter:) clojure.lang.Util.runtimeException (Util.java:221) 
jcode.oc-drift.aquisition=> 

код был изменен, чтобы поставить XML-г/XML -> позвонить в Выпускаемое заявление следующим образом

(defn parse-data 
[raw-data] 
(let [soap-data (:body raw-data) 
     soap-envelope (zip/xml-zip 
        (xml/parse 
         (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8")))) 
     result-data (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :GetNextTripsForStopResponse :GetNextTripsForStopResult)] 
     (pprint result-data))) 

Является ли это ошибка с формой пусть, или я что-то отсутствует о поведении XML-> функциональности?

Полный код файла с вызовом функции нерабочей:

ЦСИ/привет/core.clj:

(ns hello.core 
(:require [clj-http.client :as http-client] 
      [clojure.zip :as zip] 
      [clojure.xml :as xml] 
      [clojure.data.xml :as xml-data] 
      [clojure.data.zip.xml :as xml-z])) 

(use 'clojure.pprint) 

(def app-id "redacted") 
(def api-key "redacted") 
(def post-data {:apiKey api-key :appID app-id}) 

(defn get-data 
[post-data function] 
"function is a string with the api function to be called" 
    (let [url (str "redacted" function)] 
    (http-client/post url {:form-params post-data}))) 

(defn parse-data 
[raw-data] 
(let [soap-data (:body raw-data) 
     soap-envelope (zip/xml-zip 
        (xml/parse 
         (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8")))) 
     result-data (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :GetNextTripsForStopResponse :GetNextTripsForStopResult)] 
     (pprint result-data))) 

project.clj:

(defproject hello "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :main hello.core 
    :dependencies [[org.clojure/clojure "1.7.0"]     
       [org.clojure/data.xml "0.0.8"] 
       [org.clojure/data.zip "0.1.2"] 
       [clj-http "2.2.0"]]) 
+0

Где находится 'xml-z/xml->' from? –

+0

* nod * - Я как раз собирался запросить заголовок 'ns' и любые другие изменения, необходимые, чтобы сделать это [MCVE] (http://stackoverflow.com/help/mcve)/[SSCCE] (http://sscce.org/). –

+0

Чтобы быть понятным - для идеального MCVE код должен быть достаточно полным, чтобы кто-то другой мог запустить REPL, вставить прямо из вашей проблемы и увидеть одно и то же исключение без каких-либо других усилий/подготовки. Библиотечные зависимости могут сделать этот идеал немного трудным для достижения, но [lein-try] (https://github.com/rkneufeld/lein-try) и тому подобное приближают его к разуму. –

ответ

1

код вы вставили правильно и не имеете проблемы, вставленной в эту стек.

специфический ошибка показывает Unable to resolve symbol: result-data и от линии выше, что он выглядит, как он закрыл выражение, прежде чем он добрался до линии с

(pprint result-data))) 

Это походит на случае, когда есть ошибка синтаксиса выше в буфер. Например, если выше в программе был несбалансированный [ или (.

, потому что дополнительный паз открытия будет соответствовать этому и закончить выражение раньше. Две ошибки после этого добавляют доказательства этому, заставляя меня думать, что он интерпретирует `(pprint result-data)))` `как начало нового выражения с двумя дополнительными parens в конце.

попробовать:

  • ясно буфер (в сидр печати , введите clear) и попробуйте еще раз.
  • попробуйте перезапустить nrepl (в сидрах ,, затем typre restart) и повторите попытку.

работает ваш код работает правильно и при запуске в РЕПЛ и при оценке из файла (это точно то же opperation)

hello.core> (defn parse-data 
       [raw-data] 
       (let [soap-data (:body raw-data) 
        soap-envelope (zip/xml-zip 
            (xml/parse 
            (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8"))))] 
       (pprint (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :Tag1 :Tag2)))) 
#'hello.core/parse-data 
hello.core> (defn parse-data 
       [raw-data] 
       (let [soap-data (:body raw-data) 
        soap-envelope (zip/xml-zip 
            (xml/parse 
            (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8")))) 
        result-data (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :GetNextTripsForStopResponse :GetNextTripsForStopResult)] 
       (pprint result-data))) 
#'hello.core/parse-data 

так что это действительно выглядит как проблема окружающей среды.Вот еще несколько вещей, чтобы проверить:

  • РЕПЛ находится в правильном пространстве имен
  • никаких дополнительных символов не быть добавлены или изменены в процессе вырезания и вставке
  • paredit-режим не автоселектор закрывая выражения, когда они вставлены.
  • В «буфере обмена» не были добавлены «умные кавычки».
  • код работает при запуске lean repl и вставить строки в
  • lein check загружает файл без жалоб (кроме предупреждений отражения)
+0

Я очистил реплику (я не использую Emacs, поэтому я просто убил свою существующую замену лейна и сделал lein do clean, repl , после чего вставляется в код как с работающей, так и с неработающей функцией синтаксического анализа , и получил тот же результат. Я обновил вопрос с полным пространством имен –

+0

Я дважды проверил пространство имен, и это правильно. Я не могу найти никаких дополнительных символов, которые отличаются копией и прошлым (а также фрагмент кода без вызова xml-z/xml-> в работе let) Я не использую emacs, поэтому no paraedit-mode Никаких умных кавычек не добавляется при рассмотрении в re pl lein check дает мне успех (кроме предупреждений об отражении) и код без кода работает в repl при вставленном, но код с вызовом в let не делает. –

+0

Возможно, сделав то же самое, хотя начиная с совершенно пустого проекта и включив только код, скопированный из этого вопроса, вы затем найдете разницу между рабочей версией этого вопроса и нерабочим в вашем проекте. Это довольно утомительный подход, хотя у него есть хорошие шансы найти проблему. –

1

вставленный код работает для меня. Я думаю, что проблема должна быть связана с используемой вами репутацией, компилятором editor/repl или другим. Создайте новый проект и вставьте в следующем:

> lein new app hello 

Затем отредактировать 2 файла:

project.clj

(defproject hello 
    "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :main hello.core 
    :dependencies [[org.clojure/clojure "1.7.0"]     
       [org.clojure/data.xml "0.0.8"] 
       [org.clojure/data.zip "0.1.2"] 
       [clj-http "2.2.0"]]) 

src/hello/core.clj

(ns hello.core 
    (:require [clj-http.client :as http-client] 
      [clojure.zip :as zip] 
      [clojure.xml :as xml] 
      [clojure.data.xml :as xml-data] 
      [clojure.data.zip.xml :as xml-z])) 

(use 'clojure.pprint) 

(def app-id "redacted") 
(def api-key "redacted") 
(def post-data {:apiKey api-key :appID app-id}) 

(defn get-data 
[post-data function] 
"function is a string with the api function to be called" 
    (let [url (str "redacted" function)] 
    (http-client/post url {:form-params post-data}))) 

(defn parse-data 
[raw-data] 
(let [soap-data (:body raw-data) 
     soap-envelope (zip/xml-zip 
        (xml/parse 
         (java.io.ByteArrayInputStream. (.getBytes (str soap-data) "UTF-8")))) 
     result-data (xml-z/xml-> soap-envelope :soap:Envelope :soap:Body :GetNextTripsForStopResponse :GetNextTripsForStopResult)] 
     (pprint result-data))) 

(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (println "Hello, World!")) 

Затем запустите его из команды строка

> lein run  
Hello, World! 

Нет ошибки компилятора (конечно, без данных испытаний, мы фактически не вызвать любого из функций, либо).

Похоже, что проблема находится где-то в вашей среде. Если вы очистите все и начнете новый в новом проекте, вы должны увидеть те же результаты.

 Смежные вопросы

  • Нет связанных вопросов^_^