我有一个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"
}
}
如何自定义配置以获得此输出?谢谢!
答案 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。另一方面,它需要序列化才能变成字符串。