【问题标题】:Grails XML converter add XML from fileGrails XML 转换器从文件中添加 XML
【发布时间】:2019-01-31 20:15:24
【问题描述】:

我正在使用 Grails XML 转换器为某些域类注册自定义 XML 编组器。

我需要将一个类中的 XML 附加到目标 XML 中,例如:

<myobject>
  <field1>xxx</field1>
  <file>
    <data>..</data>
    ...
  </file>
</myobject>

其中 field1 在 MyObject 上声明,但文件子树是从文件加载的。

我发现了两种方法,都是转义文件子树生成的标签:

<myobject>
  <field1>xxx</field1>
  &lt;file&gt;
    &lt;data&gt;..&lt;/data&gt;
    ...
  &lt;/file&gt;
</myobject>

使用 convertAnother 和 chars 的这些方法都产生相同的结果:

XML.registerObjectMarshaller(MyObject) { o, xml ->

   def _file = new File(o.file_name)

   xml.build {
      field1(o.field1)

      xml.startNode 'file'

         //xml.convertAnother vf.text
         xml.chars vf.text

      xml.end()
   }
}

是否可以添加文件内容但未转义?

【问题讨论】:

  • 也尝试了 JSON 转换器,做同样的事情,我得到一个转义的 JSON。
  • 你试过mkp.yieldUnescaped somestring吗?我使用它,但我不能确定我在哪里学到的,mkp 完全未声明,但它有效......

标签: xml grails converter


【解决方案1】:

我发现唯一可行的方法是使用 XML 构建器的内部编写器 API:

我的代码看起来完全像这样:

it.registerObjectMarshaller(Contribution) { contribution, xml ->
            xml.attribute 'xsi:type', 'CONTRIBUTION'
            xml.build {
               uid {
                  value(contribution.uid)
               }
               contribution.versions.each { version ->

                  def xml_version = new File(version.fileLocation).text

                  // remove any internal xml and namespace declaration
                  xml_version = xml_version.replaceFirst('<\\?xml version="1.0" encoding="UTF-8"\\?>', '')
                  xml_version = xml_version.replaceFirst('xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', '')
                  xml_version = xml_version.replaceFirst('xmlns="http://schemas.openehr.org/v1"', '')

                  // change version for versions
                  xml_version = xml_version.replaceFirst(/<version( )*/, '<versions ')
                  xml_version = xml_version.replaceFirst('</version>', '</versions>')

                  // this is what outputs the exact text in the XML
                  xml.writer.mode = org.grails.web.xml.XMLStreamWriter.Mode.CONTENT
                  xml.writer.writer.unescaped().write(xml_version)
               }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多