0

我正在尝试使用 jQuery 操作 XML。特别是,我想对Question标签的值进行分组,GroupName这样我就可以创建一个带有GroupNameas 标题的 jQuery Accordion 和每个GroupName作为内容的问题。

XML:

<?xml version="1.0"?>
<GenericFormData>
  <UserQuestions>
    <UserQuestion>
      <BoxID>Box_1_6</BoxID>
      <Question>Refund requested?</Question>
      <FieldType>3</FieldType>
      <GroupName/>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_1_7</BoxID>
      <Question>Would you like to receive forms?</Question>
      <FieldType>3</FieldType>
      <GroupName/>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_2_14</BoxID>
      <Question>Listing nihil?</Question>
      <FieldType>3</FieldType>
      <GroupName>VIII</GroupName>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_2_15</BoxID>
      <Question>Creation date</Question>
      <FieldType>2</FieldType>
      <GroupName>Date and signature</GroupName>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_2_16</BoxID>
      <Question>Name of the person signing</Question>
      <FieldType>0</FieldType>
      <GroupName>Date and signature</GroupName>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_2_17</BoxID>
      <Question>function of the person signing</Question>
      <FieldType>0</FieldType>
      <GroupName>Date and signature</GroupName>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box_2_18</BoxID>
      <Question>Phone number of the person signing</Question>
      <FieldType>0</FieldType>
      <GroupName>Date and signature</GroupName>
    </UserQuestion>
    <UserQuestion>
      <BoxID>Box99</BoxID>
      <Question>Liability</Question>
      <FieldType>1</FieldType>
      <GroupName>VII</GroupName>
    </UserQuestion>
  </UserQuestions>
</GenericFormData>

jQuery:

$(xmlDoc).find('GroupName').filter(function () {
    return $(this).text() === groupnames[i].toString();
}).parents().find('UserQuestion').each(function () {
    //logic to display `Question` goes here
});

但这并不像它应该的那样工作。我正在迭代groupnames(包含应有的唯一值),但该each()方法产生的太多了。有人看到我做错了什么吗?非常感激。

4

1 回答 1

1

问题

如果我理解正确;我认为你的错误在于第三行

}).parents().find('UserQuestion').each(function () {
         ^----------------------^

目前您正在选择所有的parents(),这从根本上将

获取当前匹配元素集中每个元素的祖先,可选地由选择器过滤。

这意味着通过选择父母,您将获得比 更高的元素UserQuestion,这将认为您之前的过滤是多余的。

解决方案

如果您能够确定这groupName将是一个直系孩子,那么您可以改用parent(),去掉复数。或者,如果这不是保证,您可以尝试将选择器添加到当前语句中,以仅选择UserQuestions,如下所示:

$(xmlDoc).find('GroupName').filter(function () {
    return $(this).text() === groupnames[i].toString();
}).parents('UserQuestion').each(function () {
    //logic to display `Question` goes here
});
于 2013-03-06T08:45:36.640 回答