0

我有一个要求,我需要始终输出可选的 XML 元素(无论数据可用性如何),同时写入 .csv 文件。

XML 文件格式

<entries> 
  <countryCode>123</countryCode>  
  <adminDataMap> 
    <testAccount>True</testAccount>  
    <code>11</code> 
  </adminDataMap>  
  <privateMap> 
    <email>abc@abc.com</email>  
    <cancelReason>Not interested</cancelReason> 
  </privateMap> 
</entries>

这里的 'entries' 根元素 'cancelReason'、'testAccount' 是可选元素,只有在数据存在时才可用。

即,一些记录将具有那些“可选”字段,而另一些则没有。

我编写了一个 XQuery 来提取所有这些元素

let $entries := /root/entries
return
    for $entry in $entries
    return
    <entries>
    {
        $entry/*,
        $entry/privateMap/email,
        $entry/privateMap/cancelReason,
        $entry/adminDataMap/code,
        $entry/adminDataMap/testAccount
    }
    </entries>

我的要求是将所有强制性和可选元素提取为 OUTPUT。即输出元数据始终保持不变。如果可选的“cancelReason”没有值,它将被填充为空白/空值[类似的东西]

请告知 XQUERY 中可以编写的任何选项以实现此目的。

4

2 回答 2

0

试试这个 Xquery:

let $entries := $root/entries

for $entry in $entries

return <OUTPUT>
{<mandatory>{$entry//countryCode}
{<adminDataMap>{$entry//adminDataMap/code}</adminDataMap>}
{$entry//privateMap/email}</mandatory>}
{<optional>{<testAccount>{data($entry/adminDataMap/testAccount)}</testAccount>}
<cancelReason>{data($entry/privateMap/cancelReason)}</cancelReason></optional>
}</OUTPUT>

这为每个条目分别提供了强制性和可选元素。

于 2016-06-29T09:06:23.637 回答
0

试试这个 XQuery:

for $entry in $entries
return
    <entries>
    {
        for $admin in $entry/adminDataMap
        return
            <admin>
                {$admin/code}
                <testAccount>{data($admin/testAccount)}</testAccount>
            </admin>,

        for $private in $entry/privateMap
        return
            <private>
                {$private/email}
                <cancelReason>{data($private/cancelReason)}</cancelReason>
            </private>
    }
    </entries>

这将为您提供缺少可选元素的空白元素。


好吧,试试这个

return
    <entries>
    {
        for $admin in $entries/adminDataMap
        return
            <admin>
                {$admin/code}
                <testAccount>{data($admin/testAccount)}</testAccount>
            </admin>,

        for $private in $entries/privateMap
        return
            <private>
                {$private/email}
                <cancelReason>{data($private/cancelReason)}</cancelReason>
            </private>
    }
    </entries>

我在 BaseX 和 SqlServer 上测试了这两种方法 - 都有效。


我想这一切都取决于你如何设置初始值。
root在你的代码中看到:

let $entries := /root/entries

同时,在 xml 中没有具有root名称的元素。

如果值设置如下,则此代码有效:

let $entries :=
<entries>
    <!-- ... -->
</entries>
于 2016-06-29T10:52:40.700 回答