1

我正在使用 Web-Harvest 进行一些网页“抓取”。我有一个需要组织的值表。表非常简单。但是,我需要使用表的列标题来确定每列的数据类型。桌子看起来像这样......

<table>
  <tr class="header">
    <td>Name</td>
    <td>Age</td>
    <td>Gender</td>
  </tr>
  <tr>
    <td>Bill</td>
    <td>25</td>
    <td>M</td>
  </tr>
  <tr>
    <td>Emily</td>
    <td>31</td>
    <td>F</td>
  </tr>
</table>

我正在使用 XQuery,如 Web-Harvest 示例中所示,并且我知道如何通过索引以及使用属性(类、id 等)获取值,但在这种情况下,我不确定如何确定第 1 列是名称,第 2 列是年龄,等等...我想以这种形式输出 XML...

<person>
  <name>Bill</name>
  <age>25</age>
  <gender>M</gender>
</person>
<person>
  <name>Emily</name>
  <age>31</age>
  <gender>F</gender>
</person>

我从另一篇文章中看到了这段代码片段,但我不确定它是如何工作的。

//tr[td[.="Jim"]]/td[count(ancestor::table/thead/tr/th[.="Credit"]/preceding-sibling::*)+1]

看起来每行都引用了祖先(父级?)来查找相应的列标题。除此之外,我迷路了。任何其他信息都会非常有帮助。

提前致谢。

4

1 回答 1

1

这个 XQuery 表达式

  <persons>
   {
   let $names := /*/tr[1]/td
     return
         for $tr in /*/tr[position() ge 2]
           return
             <person>
               { for $i in 1 to count($tr/td)
                   return
                     element {$names[$i]} {$tr/td[$i]}
               }
            </person>
     }
   </persons>     

应用于提供的 XML 文档时

<table>
  <tr class="header">
    <td>Name</td>
    <td>Age</td>
    <td>Gender</td>
  </tr>
  <tr>
    <td>Bill</td>
    <td>25</td>
    <td>M</td>
  </tr>
  <tr>
    <td>Emily</td>
    <td>31</td>
    <td>F</td>
  </tr>
</table>

产生想要的正确结果

<persons>
   <person>
      <Name>
         <td>Bill</td>
      </Name>
      <Age>
         <td>25</td>
      </Age>
      <Gender>
         <td>M</td>
      </Gender>
   </person>
   <person>
      <Name>
         <td>Emily</td>
      </Name>
      <Age>
         <td>31</td>
      </Age>
      <Gender>
         <td>F</td>
      </Gender>
   </person>
</persons>
于 2012-05-03T03:14:57.610 回答