将XML中的atrribute转换为JSON

时间:2016-04-18 08:07:10

标签: json xml marklogic

我有一个XML文档,希望将其转换为JSON字符串:

<?xml  version="1.0" encoding="UTF-8"?>
<root name="test-root">
<id lang="en">9876</id>
<jobCode name="Teacher" xmlns:teacher="http://example.com/ns/teacher">1009</jobCode>
</root>

我使用此自定义配置来执行此操作:

let $config := json:config("custom")     
let $_ := map:put( $config, "whitespace", "ignore" )
let $_ := map:put( $config, "ignore-attribute-names",(xs:QName("name"),xs:QName("lang")) )
return json:transform-to-json( fn:doc("/test1.xml"),$config)

以下是此脚本的输出:

{
    "root": {
        "id": "9876", 
        "jobCode": "1009"
    }
}

这不是我的预期,我想在 root 元素中包含 名称 属性,但忽略元素 jobCode 中的 名称 属性。我的期望如下:

{
    "root": {
        "name": "test-root",
        "id": "9876", 
        "jobCode": "1009"
    }
}

如何自定义配置以获得此输出?谢谢!

2 个答案:

答案 0 :(得分:2)

我不相信这个选项和你希望的那样先进。

在这种情况下,我会使用样式表来预处理我的XML以对其进行更多按摩。这是一个工作样本:

  xquery version "1.0-ml";
import module namespace json="http://marklogic.com/xdmp/json"
 at "/MarkLogic/json/json.xqy";


let $xml := <root name="test-root">
<id lang="en">9876</id>
<jobCode name="Teacher"    xmlns:teacher="http://example.com/ns/teacher">1009</jobCode>
</root>

let $template := <xsl:stylesheet version="1.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@name[name(./..) = 'jobCode']" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

let $filtered-xml := xdmp:xslt-eval($template, $xml)

let $config := json:config("custom")     
let $_ := map:put( $config, "whitespace", "ignore" )
let $_ := map:put( $config, "ignore-attribute-names",(xs:QName("lang")) )
return json:transform-to-json( $filtered-xml,$config)

结果:

{
  "root": {
    "name": "test-root",
    "id": "9876",
    "jobCode": "1009"
  }
}

如果你走这条路,那么你也可以在模板中匹配@lang并同时删除ignore-attribute配置。

答案 1 :(得分:0)

在原始文件中,两个名称属性都在未命名的命名空间中。 元素(但不是属性)继承当前范围的命名空间。 通过指定忽略所有属性QName(&#34; name&#34;),处理器正确地省略了所有&#34; name&#34;属性。 我知道这不是你想要的&#39;但经过反思,它应该是你所期望的&#39; ... ...当两个名称属性是相同的QName时,代码如何知道root / @ name和jobCode / @ name之间的区别?

大卫(恩尼斯)的方法是(推荐的)解决此类问题的方法之一。 json:xxx代码是一个便利库,它可以合理地简单地处理常见的用例,但是,如果有的话,只需简单地解决每个用例。

如果您的输入是输入并且输出几乎但不完全&#39;那么通常预转换然后json:xxx调用的组合是有用的。 ...然后有时简单地转换json:xxx库后面的问题案例是一个合理的权衡。

特别是在ML 8.0及更高版本中,json的结果:transform-from-xml()生成一个本机JSON对象(不是字符串)。根据您的使用情况,这可能是一个显着差异 - 它不需要重新解析变成本机JSON。另一方面,它需要序列化才能变成字符串。