【发布时间】:2016-03-15 14:56:00
【问题描述】:
我有一些来自 web 服务的 xml,我想解析并创建一个嵌套的无序列表,以便我可以使用 CSS 设置样式以使其看起来像树视图。 xml如下:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfNavMenuItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ HR EMP SELF SERVICE</PRIMARY_FOLDER>
<MENU_DISPLAY_NAME>Accommodation Request</MENU_DISPLAY_NAME>
</NavMenuItem>
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ HR EMP SELF SERVICE</PRIMARY_FOLDER>
<MENU_DISPLAY_NAME>Additional Personal Information</MENU_DISPLAY_NAME>
</NavMenuItem>
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ HR EMP SELF SERVICE</PRIMARY_FOLDER>
<MENU_DISPLAY_NAME>All Actions Awaiting Your Attention</MENU_DISPLAY_NAME>
</NavMenuItem>
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ CORP HR TIME SELF SERVICE</PRIMARY_FOLDER>
<SECONDARY_FOLDER>Time</SECONDARY_FOLDER>
<MENU_DISPLAY_NAME>Create Timecard</MENU_DISPLAY_NAME>
</NavMenuItem>
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ CORP HR TIME SELF SERVICE</PRIMARY_FOLDER>
<SECONDARY_FOLDER>Time</SECONDARY_FOLDER>
<MENU_DISPLAY_NAME>Recent Timecards</MENU_DISPLAY_NAME>
</NavMenuItem>
<NavMenuItem>
<DOMAIN_USERNAME>SomeUser</DOMAIN_USERNAME>
<PRIMARY_FOLDER>XYZ CORP HR TIME SELF SERVICE</PRIMARY_FOLDER>
<SECONDARY_FOLDER>Time</SECONDARY_FOLDER>
<MENU_DISPLAY_NAME>Timecard Search</MENU_DISPLAY_NAME>
</NavMenuItem>
</ArrayOfNavMenuItem>
到目前为止,我可怜的人对 jQuery 的尝试。在遍历每个导航项并将它们添加到适当文件夹内的<li></li> 之前,我不确定如何捕获主文件夹、辅助文件夹结构
//AJAX CALL
$(response).find('NavMenuItem').each(function (index) {
var test = ($(this).find('SECONDARY_FOLDER').length > 0) ? '<ul><li><label for="subfolder' + index +'">' + $(this).find("SECONDARY_FOLDER").text() + '</label><input type="checkbox" id="subfolder' + index + '">' : '';
$('.SearchResults').append('<ul class="tree"><li><label for="folder' + index + '">' + $(this).find("PRIMARY_FOLDER").text() + '</label>'
+ '<input type="checkbox" checked id="folder' + index + '" />'
+ test
+ '<ul><li class="file"><a href="#">' + $(this).find("MENU_DISPLAY_NAME").text() + '</a></li></ul>'
+ '</li></ul>');
});
但我想要的 HTML 输出是这样的:
<ul class="tree">
<li>
<label for="folder1">XYZ CORP HR TIME SELF SERVICE </label>
<input type="checkbox" checked id="folder1" />
<ul>
<li><label for="subfolder1">Time</label> <input type="checkbox" id="subfolder1" />
<ul>
<li class="file"><a href="#" target="_tab">Create Timecard</a></li>
<li class="file"><a href="#" target="_tab">Recent Timecards</a></li>
<li class="file"><a href="#" target="_tab">Timecard Search</a></li>
</ul>
</li>
</ul>
</li>
<li>
<label for="folder2">XYZ HR EMP SELF SERVICE</label> <input type="checkbox" id="folder2" />
<ul>
<li class="file"><a href="#" target="_tab">Accommodation Request</a></li>
<li class="file"><a href="#" target="_tab">Additional Personal Information</a></li>
<li class="file"><a href="#" target="_tab">All Actions Awaiting Your Attention</a></li>
</ul>
</li>
</ul>
【问题讨论】:
-
我的问题是,我最初是通过使用 XSLT 转换 xml 来构建这个解决方案的,所以我有一种方法来模板化并在匹配时返回调用,从而有效地基于匹配创建分组。我很难在 jQuery 中模拟那种模板匹配的行为。但现在我不能使用 XSLT。它必须是客户端的所有 jQuery/JavaScript/CSS 解决方案
-
我会为它写代码,但你检查过吗:stackoverflow.com/questions/6578154/… ?
标签: javascript jquery html xml html-lists