我试图弄清楚如何使用带有兄弟节点的AND运算符进行选择。我有以下XML:
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>VAN</TYPE>
<PRICE>23.42</PRICE>
<COLOR>YELLOW</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>GREEN</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>24</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>80.00</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>26</ITEM>
</CATEGORY>
</PRODUCT>
我想选择所有产品类型为Car,门为5,Category.Item为23.我试图这样做而不必手动运行foreach循环,是否有选择器可以实现这个?
答案 0 :(得分:1)
没有只有jQuery选择器的解决方案,主要是因为jQuery :contains
选择器也匹配子串。如果这不是你的问题,那么这将做你想要的:
var match = $(xml).has('>type:contains("CAR")')
.has('>doors:contains("5")')
.has('>category>item:contains("23")');
var xml = `<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>VAN</TYPE>
<PRICE>23.42</PRICE>
<COLOR>YELLOW</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>GREEN</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>24</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>80.00</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>26</ITEM>
</CATEGORY>
</PRODUCT>`;
var match = $(xml).has('>type:contains("CAR")')
.has('>doors:contains("5")')
.has('>category>item:contains("23")');
xmlResult = $('<div>').append(match).html();
console.log(xmlResult);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
要处理上述解决方案的限制,并且只接受完全匹配的文本,您需要进行迭代,例如使用filter
:
var match = $(xml).filter(function () {
return $(this).find('>type').text() == 'CAR' &&
$(this).find('>doors').text() == '5' &&
$(this).find('>category>item').filter(function () {
return $(this).text() == '23';
}).length > 0;
});
var xml = `<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>VAN</TYPE>
<PRICE>23.42</PRICE>
<COLOR>YELLOW</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>23</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>23.42</PRICE>
<COLOR>GREEN</COLOR>
<DOORS>4</DOORS>
<CATEGORY>
<ITEM>24</ITEM>
</CATEGORY>
</PRODUCT>
<PRODUCT>
<TYPE>CAR</TYPE>
<PRICE>80.00</PRICE>
<COLOR>BLUE</COLOR>
<DOORS>5</DOORS>
<CATEGORY>
<ITEM>26</ITEM>
</CATEGORY>
</PRODUCT>`;
var match = $(xml).filter(function () {
return $(this).find('>type').text() == 'CAR' &&
$(this).find('>doors').text() == '5' &&
$(this).find('>category>item').filter(function () {
return $(this).text() == '23';
}).length > 0;
});
xmlResult = $('<div>').append(match).html();
console.log(xmlResult);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
注意内部filter
:需要检查所有类别项目,而不仅仅是第一项。
备注:示例XML不是真正有效的XML,因为它没有单个根节点。将它称为XML片段会更好。为了有效,您需要将其包装在标签中,例如<PRODUCTS>...</PRODUCTS>
。当然,上述解决方案看起来会略有不同。