Clojure 哈希映射到 xml

2024-03-28

我正在尝试将以下映射转换为 xml(任何具有向量值的键都需要为向量中的每个元素重复 xml 中的键)

(use 'clojure.xml)
(defn map-to-xml2 [k v]
      (cond
         (nil? k)    (for [[e a] v] {:tag e :content (map-to-xml2 e a)})
         (map? v)    (for [[e a] v] {:tag e :content (map-to-xml2 e a)})
         (vector? v) (for [x v] {:tag k :content (for [[e a] x] {:tag e :content (map-to-xml2 e a)})})
         :else       [(str v)]))

(def studios [{:company {:name "Acme Corp" :id 1 :rank 20 :employee 
                  [{:fname "Mark" :lname "Jones"} {:fname "Leroy" :lname "Bell"}]}}
              {:company {:name "Eastwood Studios" :id 2 :rank 35 :employee 
                  [{:fname "Lee" :lname "Marvin"} {:fname "Clint" :lname "Eastwood"}]}}])

(->> studios first (map-to-xml2 nil) first emit with-out-str (spit "acme.xml"))
(->> studios second (map-to-xml2 nil) first emit with-out-str (spit "eastwood.xml"))

我得到以下 xml

<?xml version='1.0' encoding='UTF-8'?>
<company>
  <rank>35</rank>
  <employee>
    <employee>
      <lname>Marvin</lname>
      <fname>Lee</fname>
    </employee>
    <employee>
      <lname>Eastwood</lname>
      <fname>Clint</fname>
    </employee>
  </employee>
  <name>Eastwood Studios</name>
  <id>2</id>
</company>

当我真正需要通过肥皂发送的是

<?xml version='1.0' encoding='UTF-8'?>
<company>
  <name>Eastwood Studios</name>
  <id>2</id>  
  <rank>35</rank>
  <employee>
    <lname>Marvin</lname>
    <fname>Lee</fname>
  </employee>
  <employee>
    <lname>Eastwood</lname>
    <fname>Clint</fname>
  </employee>
</company>

我该如何纠正以上问题?

我正在尝试从 Excel 文件中读取数据,并为具有相同 id 的每一行或每组行进行 Web 服务调用,然后使用响应更新电子表格。 以上就是生成webservice调用需要的xml。


您可能已经知道的主要问题是,当内容(即v在程序主体中)是一个向量,你必须做某种(for ...) or (map ...)表达真实地表达它的所有标签和内容。但是,这样做时,您会生成一个sequence标签,它被打包在讨厌的括号内。据我所知,您需要“取消解析”它们才能获得要传递给的正确结构(emit-element ...).

因此,在我下面的代码中,表达式(mapcat to-xml ...)位于需要嵌套的地方,因为这将执行连续项的操作,然后将它们全部连接在一起。不幸的是,您必须将曾经是单个项目返回的内容放入向量(或列表,如果您愿意)内。这就是为什么当(map? v)为真或当:else发生,整个(tag-xml ...)表达式被包裹在向量中。任何回报都将concat与其他回报一起编辑。

我想我已经找到了适合你的东西。它不是great,在我看来,因为我不喜欢它处理顶级调用的方式——即您将在代码中进行的调用(但我稍后会讨论):

(defn tag-xml
  [tag content]
  {:tag tag
   :content content})

(defn to-xml
  ([[k v]] ;//This form of to-xml is for the sake of nested calls
    (cond
      (map? v) [(tag-xml k (mapcat to-xml v))]
      (vector? v) (for [x v] (tag-xml k (mapcat to-xml x)))
      :else [(tag-xml k [(str v)])]))
  ([k v] ;//This form of to-xml is only for the sake of the top level call
    (tag-xml k (if (map? v) (mapcat to-xml v) [(str v)]))))

请注意,我添加了一个辅助函数tag-xml。这只是为了让身体to-xml更干净、更小。

这就是您可能使用它的方式(尽管在您的情况下,您将替换println和一些spit call):

=> (->> studios ffirst (apply to-xml) emit with-out-str println))
<?xml version='1.0' encoding='UTF-8'?>
<company>
<rank>
20
</rank>
<employee>
<lname>
Jones
</lname>
<fname>
Mark
</fname>
</employee>
<employee>
<lname>
Bell
</lname>
<fname>
Leroy
</fname>
</employee>
<name>
Acme Corp
</name>
<id>
1
</id>
</company>
=> nil

所以,我不喜欢这样从顶层正确调用它到一些现有的哈希映射data,你需要做(apply to-xml (first data)). You could为了解决这个问题,不要将数据作为哈希映射,而是将其构造为向量。在你的例子中,这看起来像[:company ...]代替{:company ...}对于每个工作室studios。然后,您可以使用如下所示的函数:(first (to-xml data)).

尽管如此,这并不像我希望的那样优雅。也许解决方案是有一些功能to-xml这将执行顶层调用和其他一些功能-to-xml之后就可以处理了。作为用户,您只会使用to-xml但所有艰苦的工作都将在-to-xml。我也不热衷于这个想法。还有一个想法是做一些类似于你所做的事情,如果第一个参数等于nil然后它就像顶级调用一样执行该函数。唔。

无论如何,它有效,所以就是这样。

Edit
至于想要保留顺序,您可能必须重新定义数据,或者在处理它之前对其进行转换to-xml。你不能依赖任何写成的顺序{...}。如果您想将其保留为地图,那么您could通过将其设为数组映射或排序映射来获取顺序。

如果您要重新定义它以使其成为数组映射,它将看起来像这样:

(def studios [(array-map :company (array-map :name "Acme Corp" :id 1 :rank 20
                         :employee [(array-map :fname "Mark" :lname "Jones")
                                    (array-map :fname "Leroy" :lname "Bell")]))
              (array-map :company (array-map :name "Eastwood Studios" :id 2 :rank 35
                         :employee [(array-map :fname "Lee" :lname "Marvin")
                                    (array-map :fname "Clint" :lname "Eastwood")]))])

基本上,任何你曾经去过的地方{...}你现在有(array-map ...)。在这一点上,我应该说,不要费心尝试编写一个宏来为你做到这一点,它不会起作用(请参阅此处了解我对此的问题 https://stackoverflow.com/questions/11130460/clojure-macro-that-will-conserve-associative-map-order)。如果您想使用排序映射,则必须创建一个仅返回的谓词比较器true or false基于一些硬编码的顺序,这对我来说似乎有点奇怪。

现在,如果您想转换数据,您将需要另一个包含关键订单和嵌套订单的数据结构。就像是:

(def studio-order-specs {:company [:name :id :rank {:employee [:lname :fname:]}]})

我手头没有转换函数,但是使用这个数据结构,您应该能够编写一些将哈希映射转换为指定顺序的数组映射的东西。 (您也可以使用它来转换为指定顺序的排序映射,但同样,在我看来,这将是通过以不优雅的方式定义谓词来实现。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clojure 哈希映射到 xml 的相关文章

  • 使用 PHP 获取 XML 文件的内容 [重复]

    这个问题在这里已经有答案了 可能的重复 file get contents 与 https https stackoverflow com questions 1975461 file get contents with https 使用
  • 动态元素 ID 到 setId(int) - Android

    我看到了语法定义setId int and findViewByID int 但我们如何使用findViewById R id row1 我尝试使用这个 Object1 setId Integer parseInt repeat 它没有显示
  • Web 服务 SOAP 请求适用于 SOAPUI,但不适用于 PHP

    我已经尝试了几乎所有我能找到的可能的解决方案 但我似乎无法让这个脚本工作 以下是我之前的一些尝试 如何使用 wse php 库通过 SOAP 连接到安全的 Web 服务 https stackoverflow com questions 1
  • 在 WordPress 页面上嵌入 swf

    我正在尝试将 swf 嵌入到 WordPress 页面中 这听起来很简单 但它不起作用 我不明白为什么 我已将所有相关文件上传到服务器上 并且我相当确定所有文件路径都是正确的 包含 fla 和 swf 文件的文件夹还包含一个 index h
  • XPath 节点到字符串

    如何选择以下节点的字符串内容 span class url word b class test b span span class url word b class test2 b more words span 我尝试过一些事情 span
  • Clojure 宏:从地图创建本地变量 [重复]

    这个问题在这里已经有答案了 我有这个示例代码 我通过迭代映射的键值对来创建变量 defmacro block bindings body let mapcat fn k v if symbol k k symbol name k v bin
  • 使用 SimpleXML 从 XML 获取多个项目

    我正在尝试使用下面的代码循环 XML 中的多个项目 xml get data the url data simplexml load string xml foreach data gt item AS item foreach item
  • 适用于具有不同数量数据字段的用户的功能

    这个问题是我练习的时候产生的教程中的观察者主题 http mishadoff com blog clojure design patterns episode 10 observer我试图将该功能应用于用户 但无法使用用户的数据字段 例如姓
  • > 有必要吗?

    我现在开发网站和 XML 接口已有 7 年了 从来没有遇到过真正有必要使用 gt for a gt 到目前为止 所有消歧都可以通过引用来处理 lt and alone 有没有人遇到过这样的情况 与 SGML 处理 浏览器问题 XSLT 等相
  • Clojure 中 with-local-vars 和 with-bounds 之间的区别

    Clojure 的文档with local vars http clojuredocs org clojure core clojure core with local vars and with bindings http clojure
  • Visual Studio 2012 T4 模板生成 XML 时出现错误

    我正在使用 Visual Studio 2012 从 T4 模板生成 XML 模板的顶部看起来像 lt template language VBv4 hostspecific True debug True gt lt output ext
  • 如何让 XSLT 在 Java 中返回 UTF-8

    我正在尝试让我的 XSL 脚本使用 UTF 8 编码 像 和希腊字符这样的字符就像垃圾一样出现 让它工作的唯一方法是将结果写入文件 如果我将它写入输出流 它只会返回垃圾 System out 有效 但这可能是因为它被重定向到文件 结果需要从
  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • JAXB、Marshal 的问题 - 无法封送类型“java.lang.String”

    当我运行 marshal 操作时 出现以下错误 javax xml bind MarshalException with linked exception com sun istack internal SAXException2 unab
  • 如何在sql中查询xml列

    我在 SQL Server 2008 上有一个表 T1 其中包含一个 XML 列 EventXML 我想查询某个节点包含特定值的所有行 更好的是 我想检索不同节点中的值 表T1 T1 EventID int EventTime dateti
  • XMLReader - 如何处理未声明的命名空间

    Merged https meta stackexchange com questions 158066 what is a merged question with 如何使用 XMLReader 读取未定义命名空间的 XML 文件 que
  • 如何在 .NET 中轻松取消转义 XML 实体

    我有一些代码返回 XMLNode 的 InnerXML 该节点可以只包含一些文本 带有 HTML 或 XML 例如
  • 流畅的 NHibernate 和 XML 列

    我正在从头开始构建一个新站点 并正在考虑使用 Fluent NHibernate 作为我的 ORM 我认为它可以轻松处理所有事情 可能除了我的 XML 列 我从来没有使用 NHibernate 构建过网站 尽管我使用过 Hibernate
  • 在针对 XSD 进行验证时,使用 DOM、StAX、SAX 解析器中的任何一个来查找 XML 中确切缺失的元素

    我有一个 XML 文件及其相应的 XSD 文件 在使用 StAX 解析器进行验证时 我附加了一个错误处理程序 基本上 我在格式良好的 XML 文件中遇到两种类型的错误 1 元素内的数据类型不正确 例如元素内的字符串应该具有整数 2 缺少元素
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计

随机推荐

  • 在 OpenGL 3.2 中绘制全屏四边形的最佳方法是什么?

    我正在片段着色器中进行光线投射 我可以想出几种方法来为此目的绘制全屏四边形 要么在剪辑空间中绘制一个四边形 并将投影矩阵设置为单位矩阵 要么使用几何着色器将点变成三角形带 前者使用立即模式 在 OpenGL 3 2 中已弃用 我使用后者是出
  • 如何在 Xamarin.Forms 上使用 Android AutoCompleteTextView

    我正在研究一个Xamarin forms项目但我需要使用Android Widget AutoCompleteTextView我该如何应用它 当我尝试添加时AutoCompleteTextView UserNameAutoComplete
  • 如何创建和实现像素跟踪代码

    好吧 这是我一直在寻找的目标 众所周知 大多数广告和分析公司使用所谓的 像素 代码来跟踪网站浏览 交易 转化等 我确实知道它是如何工作的 问题是如何实现它 跟踪代码由几个部分组成 跟踪代码本身 这是用户在其网页上插入的代码部分 该代码的主要
  • 在 AsyncTask 中使用等待

    当使用wait in an AsyncTask I get ERROR AndroidRuntime 24230 Caused by java lang IllegalMonitorStateException object not loc
  • Intellij 无法理解 SQL 字符串

    大家 我正在制作一个玩具网络应用程序 它使用 Spring Boot 和 Mybatis Mybatis映射器配置Java接口 我希望 Intellij 能够理解 SQL 字符串 但事实并非如此 我期待像下面这样的 如果它理解 Intell
  • curl_getinfo($ch, CURLINFO_CERTINFO) 为空

    我有 PHP 7 2IUS https ius io GettingStarted 存储库 但默认 PHP CentOS 7 x 上的行为相同 Code domain google com ch curl init curl setopt
  • 404 页面适用于本地主机,但不适用于生产(Azure Web App)

    我的本地主机上有一个 404 页面 运行得很好 但是 当它被推送到 Azure Web App 时 却没有 我最初是通过发布工具推送它的 现在我使用从 Github 分支推送的内置功能 我有以下内容网络配置
  • “Line2D”对象没有属性“kind”

    我刚刚开始学习 pandas 当时我想制作 2013 年车站平均值的条形图 以创建一个fig ax plt subplots 对象并将绘图添加到创建的 ax 我在运行这部分代码时收到此错误 Line2D 对象没有属性 kind fig ax
  • 无法在 Tkinter 中禁用自动换行

    我正在尝试在禁用自动换行和水平滚动条的文本窗口中写入 如下所示 root Toplevel root geometry dx d 0 0 350 400 af Frame root chtext Text af width 45 wrap
  • 2.5升级后无法编辑Streamfield页面

    我在本地开发中有一个使用 Streamfield 和 2 个自定义 StructBlock 字段的站点 在 2 4 中工作正常 但升级到 2 5 后 我可以在管理中正常创建页面 但当我保存后在管理中编辑该页面时 会出现错误 我也尝试使用新的
  • 如何将div转换为图像?

    我有一个 div 我需要制作这个 div 的图像并发送给服务器 有什么方法可以使用 Angular 7 来做到这一点吗 我尝试搜索库但没有结果 所有解决方法都使用原生 JS 要将 HTML 内容保存到图像中 您需要使用HTML2CANVAS
  • 在 rabin-karp 滚动哈希中选择基数和模素数

    哈希函数的解释为维基百科 http en wikipedia org wiki Rolling hash 它说 a 和 n 的选择对于获得良好的散列至关重要 并引用了一篇感觉不相关的线性同余生成器文章 我无法弄清楚这些值是如何选择的 有什么
  • driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS) 不起作用

    driver manage timeouts implicitlyWait 10 TimeUnit SECONDS 上面的隐式等待代码在 Google Chrome 上对我不起作用 我尝试过使用 selenium 2 47 和 2 53 1
  • 如何在 conda 环境中启动 exe

    我在 Windows 10 中使用 vscode 作为代码编辑器 并希望找到一种简单的方法来使用正确的 conda env 启动它以进行调试 目前 我必须打开命令提示符 然后激活 conda env 然后将 vscode 的快捷方式粘贴到提
  • 直接渲染CGImage(而不是UIImage)?

    我正在做一个CGImage func otf gt CGImage 这是渐变上的贝塞尔蒙版 所以 the path let p UIBezierPath p moveTo etc the mask let m CAShapeLayer se
  • Crystal Reports 10 命令对象更改数据源位置

    我已经在 Crystal Report 中使用了命令对象 现在我需要更改数据源 我已按照知识库文章 c2016958 中的说明进行操作 下载 解压缩并应用了 cr10win en zip 和 dbex10win en zip 但我的连接仍然
  • 访问reactjs中的viewbag属性

    我正在开发一个Web应用程序 我使用reactjs和MVC c 我想知道 jsx 是否包含在 cshtml 中 是否可以访问 jsx 中的 viewbag 属性 我想要将一个对象或 id 传递给 jsx 并将其呈现在 UI 中 ViewBa
  • 如何制作单独的角材料步进器标题和内容?

    我正在用有角度的材料做一个垂直步进器 问题是这个步进器将每个步骤的内容放在步骤标题下方 因此如果有很多步骤 它看起来会很糟糕 因为你必须滚动 我的想法是将标题与内容分开 这样它看起来更像是侧导航 但具有角度材质功能 这是我现在所拥有的 内容
  • 从 Java Applet 调用 Javascript 函数

    我在 HTML 页面中有一个 Java Applet 我需要让小程序调用某个 Javascript 函数来通知 HTML 页面某些事件 我目前调用 JavaScript 函数的方式是 getAppletContext showDocumen
  • Clojure 哈希映射到 xml

    我正在尝试将以下映射转换为 xml 任何具有向量值的键都需要为向量中的每个元素重复 xml 中的键 use clojure xml defn map to xml2 k v cond nil k for e a v tag e conten