如何迭代XML文件,将属性对拉出为输出CSV文件中的行

时间:2015-08-19 22:29:06

标签: xml xml-parsing xquery

我无法找到符合这一特定要求组合的答案,而且卡住了。

我的档案是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<lvl1>
  <lvl2>
    <lvl3>
      <topic label="grandparent" href="gp1.html">
        <topic label="parent" href="p1.html">
           <topic label="child" href="c1.html">
              <topic label="grandchild1" href="gc1.html"/>
              <topic label="grandchild2" href="gc2.html"/>
...

我想要的输出是这样的:

gradparent,gp1.html
parent,p1.html
child,c1.html
grandchild1,gc1.html
grandchild2,gc2.html

即。目标是将成对的标签和href压缩成csv文件。我的源文件有多个嵌套的主题元素,这些元素有很多层次,有些是兄弟主题元素。

我尝试过这样的事情:

let $input := (my_file.xml)
let $nl := "&#10;"
let $output :=
string-join(
for $topic in $input//topic 
return
string-join(
for $lab in $topic/*
return
$lab/@label/data()
, ',')
, $nl)

return $output

但是那个甚至还不到一半......我很想知道我有多远。感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用@*获取所有属性,但订单未指定。所以使用(@label,@href)。无需第二个for

let $input := (my_file.xml)
let $nl := "&#10;"
let $output :=
  string-join(
    for $topic in $input//topic 
    return string-join($topic/(@label,@href), ',')
  , $nl)
return $output

您甚至不需要第一个for

let $input := (my_file.xml)
let $nl := "&#10;"
let $output :=
  string-join(
    $input//topic/string-join((@label,@href), ',')
  , $nl)
return $output