使用xpath遍历xml树时出现问题

时间:2015-07-07 09:41:17

标签: xml xpath asp-classic

我有一些遗留xml,用于为网站的某个区域创建导航:

<?xml version="1.0" encoding="utf-8"?>
<Menu>
    <menuItem>
        <Name>About</Name>
        <ID>1</ID>
        <Link>/about/index.html</Link>
        <menuItem>
            <Name>Vision</Name>
            <ID>1.1</ID>
            <Link>/about/Vision.html</Link>
        </menuItem>
        <menuItem>
        <Name>History</Name>
            <ID>1.2</ID>
            <Link>/about/history.html</Link>
            <menuItem>
                <Name>Relocation</Name>
                <ID>1.2.1</ID>
                <Link>/about/relocation.html</Link>
            </menuItem>
        </menuItem>
    </menuItem>
</Menu>

网站本身是用经典ASP构建的,所以我尝试使用XPath来渲染导航:

Dim objXML, strLeftNav
Set objXML = Server.CreateObject("MSXML2.DomDocument.4.0")
objXML.async=false
objXML.load("nav.xml")
If objXML.parseError.errorcode = 0 Then
    Dim xmlNode
    For Each xmlNode In objXML.selectNodes("*/menuItem/*")
        Set xmlNameNode = xmlNode.selectSingleNode("//Menu/menuItem/Name")
        strLeftNav = strLeftNav & "<li>" & xmlNameNode.nodeTypedValue & "</li>"
    Next
    Set xmlNameNode = Nothing
End If
Set objXML = Nothing
Response.Write("<ul>" & strLeftNav & "</ul>")

这给我留下了一些李只是显示第一个名称节点是&#39;关于&#39;我试图将每个menuItem节点的Name节点拉出到列表中,有人可以建议我使用正确的XPath语法吗?

2 个答案:

答案 0 :(得分:0)

XPath表达式//Menu/menuItem/Name从树的根开始进行绝对选择。您想要选择相对于当前位置的位置,可能是Name。但是你还没有说清楚如何处理输入XML的递归结构,不清楚你真正想要的是什么输出。

答案 1 :(得分:0)

这似乎对我有用,可能有助于其他人:

    Set xmlNodes = xmlobj.selectNodes("//menuItem/menuItem")
    If xmlNodes.Length = 0 Then Response.Write "No results found!"
    Dim xmlItem
    For Each xmlItem In xmlNodes
        Set xmlNameNode = xmlItem.selectSingleNode(".//Name")
        Set xmlIDNode = xmlItem.selectSingleNode(".//ID")
        Set xmlLinkNode = xmlItem.selectSingleNode(".//Link")

        [use code such as xmlLinkNode.nodeTypedValue to create <ul>]

    Next
    Set xmlNodes = Nothing