代码之家  ›  专栏  ›  技术社区  ›  Ryan French

从ColdFusion中的不同节点提取XML名称/值对

  •  4
  • Ryan French  · 技术社区  · 15 年前

    我正在使用XMLAPI进行一些PLESK集成,我正试图找出如何解析返回的XML响应。大部分数据都很好,但是http://download1.parallels.com/plesk/ppp9/doc/en-us/plesk-9.2-api-rpc/index.htm?文件名=28788.htm>限制和权限的设置不同。基本上,它们是这样设置的:

    <data>
      <limits>
        <limit>
          <name>foo</name>
          <value>bar</value>
        </limit>
        <limit>
          <name>foo2</name>
          <value>bar2</value>
        </limit>
      </limits>
    </data>
    

    如果我知道我想要“foo”的值,而不是“foo2”的值,那么如何从XML中提取“bar”?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Ivo Sabev    15 年前
    <cfset my_xml = XmlParse(XMLCODE) />
    
    <cfoutput>
    1: #my_xml.data.limits[0].limit.value#
    <br />2: #my_xml.data.limits[1].limit.value#
    </cfoutput>
    
        2
  •  1
  •   Edward M Smith    15 年前

    如果您明确知道限制的“名称”将是什么,那么可以使用xpath。您要查找的是名称子节点为“foo”的任何限制节点的“value”子节点。在xpath中,如下所示:

    '/data/limits/limit[name = 'foo']/value'
    

    这将返回一个节点数组(因为可能有多个匹配项),因此我们需要处理该数组。整个例子是:

        <cfset myXML = "
        <data>
          <limits>
            <limit>
              <name>foo</name>
              <value>bar</value>
            </limit>
            <limit>
              <name>foo2</name>
              <value>bar2</value>
            </limit>
          </limits>
        </data>
    ">
    <!--- Parse the string into an XML Object --->
    <cfset XMLDOM = xmlParse(myXML)>
    <!--- Search the XML Object for specific nodes --->
    <cfset nodeArray = xmlSearch(XMLDOM,"/data/limits/limit[name = 'foo']/value")>
    <!--- Loop over the returned array of XML Node objects and print the XMLText (the node value) --->
    <cfloop array="#nodeArray#" index="thisNode">
        <cfoutput>#thisNode.xmlText#</cfoutput>
    </cfloop>